FL4*_*SOF 4 c++ memory pointers memory-management stl
typedef struct temp
{
int a,b;
char *c;
temp(){ c = (char*)malloc(10);};
~temp(){free(c);};
}temp;
int main()
{
temp a;
list<temp> l1;
l1.push_back(a);
l1.clear();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出分段错误.
Bin*_*ier 27
您没有复制构造函数.
当您将'a'推入列表时,它会被复制.因为您没有复制构造函数(为c分配内存并从旧c复制到新c)c是a中的相同指针和列表中a的副本.
两个的析构函数都被调用,第一个将成功,第二个将失败,因为内存c指向已经被释放.
你需要一个复制构造函数.
要查看发生了什么,请在构造函数和析构函数中添加一些couts并逐步执行代码.
你需要一个深拷贝构造函数来避免double free().你有一个temp类的变量(a),然后你将它添加到列表中.变量被复制.然后清除列表,内部元素被销毁并调用free().然后,一个变量被销毁和free()再次呼吁,这导致分段错误相同的地址.
您需要一个复制构造函数来深度复制类临时变量,这将使malloc()另一个缓冲区和复制数据.
| 归档时间: |
|
| 查看次数: |
2580 次 |
| 最近记录: |