所以问题的实质是:
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
指针,但我不知道在哪里。
或者我可能只是使用错误的智能指针或类似的东西?
由于
答案 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_ptr
。 shared_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时,变量不会被销毁 - 这会导致双重释放。