如何删除包含其自身类型指针的结构?

问题描述

我正在尝试制作一个结构体框,它具有指向其他框的指针,每个框也可以包含一些数据,而这些数据又是一个结构体。我创建了一个新框并分配了一些值。

现在的问题是 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

解决方法

从解除分配中读取数据是未定义的行为。未定义意味着任何事情都可能发生,包括什么都不做。

实际上,当您删除内存时,堆只是将单元格标记为可用。这意味着其他一些对象可以获得对该内存的引用,并且只有在那个时候内存才会被写入。

调试堆可能会被垃圾覆盖以帮助程序员,但由于性能成本,释放堆不会。