所以问题的实质是:
//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指向,但我不知道在哪里.或者我可能只是使用错误的智能指针或类似的东西?
谢谢
您正在构建一个shared_ptr指向堆栈上现有对象的指针.不要那样做; 这不是shared_ptr意味着如何使用.永远不应删除或释放普通堆栈对象.它指向的对象应该在堆上,即使用new或等效创建.
建议的创建方法shared_ptr是make_shared:
auto p = make_shared<Big>();
Run Code Online (Sandbox Code Playgroud)
或者老式的方式:
shared_ptr<Big> p(new Big);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2800 次 |
| 最近记录: |