加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:13:26 所属栏目:百科 来源:网络整理
导读:所以问题的实质是: //Big.hclass Big{ public: int a,b;};//Mini.hclass Big;class Mini{ public: Mini(float a,shared_ptrBig ptb):ma(a),me(-a),ptb(ptb){}; float ma,me; shared_ptrBig ptb;};//mainint main(){ std::listMini lm; if(true){ //Or some
所以问题的实质是:

//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
};

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

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

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

谢谢

解决方法

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

创建shared_ptr的推荐方法是通过make_shared:

auto p = make_shared<Big>();

或者老式的方式:

shared_ptr<Big> p(new Big);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读