微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

现在的问题是 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 举报,一经查实,本站将立刻删除。