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

时间:2016-10-11 22:43:13

标签: c++ pointers

所以问题的实质是:

using system.linq;
Rearrange(3250).foreach(i => console.writeline(i.ToString()));

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

我怀疑shared_ptr//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时再次被释放,但我不确定并且不知道如何修复它。有人可以向我解释这个错误的原因吗?

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

由于

4 个答案:

答案 0 :(得分:5)

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

创建shared_ptr的推荐方法是make_shared

auto p = make_shared<Big>();

或老式的方式:

shared_ptr<Big> p(new Big);

答案 1 :(得分:4)

shared_ptr管理的对象必须在动态范围内构建,即使用new分配。

Big big;
big.a = 100;
big.b = 200;

Mini derp(5, shared_ptr<Big>(&big));

在这里,您将指向自动范围内构建的对象的指针推送到shared_ptrshared_ptr现在认为它拥有这个对象,它可以决定它何时进入delete

但是当自动范围内的这个对象超出范围并被销毁时,这将使shared_ptr非常非常悲伤。

使用new构造此对象,而不是在自动范围内构建它。

答案 2 :(得分:1)

<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 指向堆栈对象。你不能释放堆栈对象。以下是shared_ptr

的使用方法
shared_ptr

答案 3 :(得分:1)

要更正程序,需要在堆上分配Big对象。

if(true){ //Or some sub function or rutin
        auto big_shared_ptr = std::make_shared<Big>();
        big->a = 100; big->b = 200;
        Mini derp(5, big_shared_ptr);
        lm.push_front(derp);
    }

这样,当你的if(true)块返回以及清除shared_ptr时,变量不会被销毁 - 这会导致双重释放。