【问题标题】:Pushing shared_ptr(this) into vector results in "free(): invalid pointer" error将 shared_ptr(this) 推入向量会导致“free(): invalid pointer”错误
【发布时间】:2017-03-31 08:23:29
【问题描述】:

我正在尝试实现一个可以将指向自身的智能指针推入向量的类:

#include <memory>
#include <vector>

class A {
public:
    void pushme(std::vector<std::shared_ptr<A>> & vec) {
        vec.push_back(std::shared_ptr<A>(this));
    }
};

int main() {
    A test;
    std::vector<std::shared_ptr<A>> vec;
    test.pushme(vec);
    return 0;
}

这编译得很好,但在执行时我得到一个free(): invalid pointer 错误。请帮助我了解这里发生了什么。

【问题讨论】:

    标签: c++ c++11 vector smart-pointers


    【解决方案1】:
    A test;
    

    这在函数本地范围内声明了一个对象。对象超出范围时会自动释放。

    只有动态范围内的对象(使用new 创建)才能由std::shared_ptr 管理。这就是std::shared_ptr 的全部目的——当指向对象的最后一个共享指针消失时自动调用delete。而你只能delete 分配了new 的东西。

    【讨论】:

    • 另一方面,shared_ptr 可以持有一个负责释放对象的自定义deleter,因此理论上您可以拥有指向存储在自动内存中的对象的shared_ptr 实例,并且当所有 shared_ptr 实例超出范围时,没有在对象上调用 delete。不是你应该这样做,而是你可以做到。
    【解决方案2】:

    试试enable_shared_from_this:

    class A : public std::enable_shared_from_this<A>{
    public:
        void pushme(std::vector<std::shared_ptr<A>> & vec) {
            vec.push_back(shared_from_this());
        }
    };
    
    int main()
    {
        std::shared_ptr<A> test = std::make_shared<A>();
        std::vector<std::shared_ptr<A>> vec;
        test->pushme(vec);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2011-07-01
      • 2020-07-23
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多