将shared_ptr(this)推入矢量会导致"free(): invalid pointer"错误

Pushing shared_ptr(this) into vector results in "free(): invalid pointer" error

本文关键字:free 错误 pointer invalid ptr shared this      更新时间:2023-10-16

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

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

A test;

这将在函数本地作用域中声明一个对象。 当对象超出范围时,它会自动释放。

只有动态作用域中的对象(使用 new 创建(才能由 std::shared_ptr 管理。这就是std::shared_ptr的全部目的——当指向对象的最后一个共享指针消失时,自动调用delete。而且您只能delete已分配new的东西.

尝试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;
}