问题描述
我正在尝试制作一个结构体框,它具有指向其他框的指针,每个框也可以包含一些数据,而这些数据又是一个结构体。我创建了一个新框并分配了一些值。
现在的问题是 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
解决方法
从解除分配中读取数据是未定义的行为。未定义意味着任何事情都可能发生,包括什么都不做。
实际上,当您删除内存时,堆只是将单元格标记为可用。这意味着其他一些对象可以获得对该内存的引用,并且只有在那个时候内存才会被写入。
调试堆可能会被垃圾覆盖以帮助程序员,但由于性能成本,释放堆不会。