首页 > 解决方案 > 如何删除包含自己类型指针的结构?

问题描述

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

现在的问题是删除似乎在盒子上不起作用。我希望在删除后读取垃圾,但我仍然得到与删除前相同的数据。我添加了一个析构函数,它会打印一条消息,以便您查看它是否被调用。怎么可能调用了析构函数,但数据还在?

它似乎与包含自己类型指针的框有关,因为如果我注释掉框定义中的指针,则框中的数据内容将按预期删除。

#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, data.pi %f\n",
    ptr->data.id, 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

标签: c++c++11

解决方案


从 deallocated 读取数据是未定义的行为。未定义意味着任何事情都可能发生,包括什么也没有。

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

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


推荐阅读