将shared_ptr(this)推入向量会导致" free():无效指针"错误

时间:2016-11-16 23:09:39

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

我正在尝试实现一个可以将智能指针推送到向量中的类:

#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错误。请帮助我了解这里发生了什么。

2 个答案:

答案 0 :(得分:8)

A test;

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

new只能管理动态范围内的对象(使用std::shared_ptr创建)。这是std::shared_ptr的全部目的 - 当对象的最后一个共享指针消失时自动调用delete。并且您只能delete已使用new分配的内容。

答案 1 :(得分: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;
}