双重免费或使用共享指针损坏

Pur*_*ord 4 c++ pointers

所以问题的实质是:

//Big.h
class Big{
    public:
        int a, b;
};

//Mini.h
class Big;
class Mini{
    public:
        Mini(float a, shared_ptr<Big> ptb):ma(a), me(-a), ptb(ptb){};
        float ma, me;
        shared_ptr<Big> ptb;
};

//main
int main(){
    std::list<Mini> lm;
    if(true){ //Or some sub function or rutin
        Big big; big.a = 100; big.b = 200;
        Mini derp(5, shared_ptr<Big>(&big));
        lm.push_front(derp);
    }
  //Do something
};
Run Code Online (Sandbox Code Playgroud)

编译正常,但在退出main时会出现" 双重免费或损坏 "(在完整程序中这只是一个子功能)

我怀疑shared_ptrto big在某个时候被释放,然后在退出main时再次被释放,但我不确定并且不知道如何解决它.有人可以向我解释这个错误的原因吗?

我红了,我不得不NULL指向,但我不知道在哪里.或者我可能只是使用错误的智能指针或类似的东西?

谢谢

Ros*_*ith 6

您正在构建一个shared_ptr指向堆栈上现有对象的指针.不要那样做; 这不是shared_ptr意味着如何使用.永远不应删除或释放普通堆栈对象.它指向的对象应该在堆上,即使用new或等效创建.

建议的创建方法shared_ptrmake_shared:

auto p = make_shared<Big>();
Run Code Online (Sandbox Code Playgroud)

或者老式的方式:

shared_ptr<Big> p(new Big);
Run Code Online (Sandbox Code Playgroud)