如何解决如何删除包含其自身类型指针的结构?
我正在尝试制作一个结构体框,它具有指向其他框的指针,每个框也可以包含一些数据,而这些数据又是一个结构体。我创建了一个新框并分配了一些值。
现在的问题是 delete 似乎对盒子不起作用。我希望在删除后读取垃圾,但我仍然获得与删除前相同的数据。我添加了一个打印消息的析构函数,以便您可以查看它是否被调用。怎么可能调用了析构函数,数据还在?
这似乎与包含自己类型指针的框有关,因为如果我将框定义中的指针注释掉,框内的数据内容会按预期删除。
#include<iostream>
using namespace std;
typedef struct userdata{
int id;
double pi;
~userdata(){
cout<<"deleting userdata\n";
}
}userdata;
typedef struct Box_t{
Box_t* ptr1;
Box_t* ptr2;
userdata data;
~Box_t(){
cout<<"deleting Box\n";
}
}Box;
int main(int argc,char *argv[]){
Box* ptr=new Box;
ptr->data.id=19;
ptr->data.pi=3.14159;
cout<<ptr<<endl;
printf("data.id %i,data.pi %f\n",ptr->data.id,ptr->data.pi
);
delete ptr;
cout<<ptr<<endl;
printf("data.id %i,ptr->data.pi
);
return 0;
}
输出:
0xc61530
data.id 19,data.pi 3.141590
deleting Box
deleting userdata
0xc61530
data.id 19,data.pi 3.141590
解决方法
从解除分配中读取数据是未定义的行为。未定义意味着任何事情都可能发生,包括什么都不做。
实际上,当您删除内存时,堆只是将单元格标记为可用。这意味着其他一些对象可以获得对该内存的引用,并且只有在那个时候内存才会被写入。
调试堆可能会被垃圾覆盖以帮助程序员,但由于性能成本,释放堆不会。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。