c++ - 如何删除包含自己类型指针的结构?
问题描述
我正在尝试制作一个具有指向其他框的指针的结构框,并且每个框也可以包含一些数据,而这些数据又是一个结构。我创建了一个新框并分配了一些值。
现在的问题是删除似乎在盒子上不起作用。我希望在删除后读取垃圾,但我仍然得到与删除前相同的数据。我添加了一个析构函数,它会打印一条消息,以便您查看它是否被调用。怎么可能调用了析构函数,但数据还在?
它似乎与包含自己类型指针的框有关,因为如果我注释掉框定义中的指针,则框中的数据内容将按预期删除。
#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
解决方案
从 deallocated 读取数据是未定义的行为。未定义意味着任何事情都可能发生,包括什么也没有。
实际上,当您删除内存时,堆只是将单元格标记为可用。这意味着其他一些对象可以获得对该内存的引用,并且只有在该点才会写入内存。
调试堆可能会用垃圾覆盖以帮助程序员,但由于性能成本,释放堆不会。
推荐阅读
- c# - 自适应卡片在 Facebook Messenger 中不起作用
- c# - StreamReader.WriteLine 在初始 Post 统一后不起作用
- go - 如何解组 yaml 数组?
- java - 如何将带有嵌套数组(包括 Json 对象)的 Json 对象持久保存到一张表中的 sql 数据库中?
- google-cloud-platform - 从 Google Cloud Storage 访问 gcs-bucket 中的 Google 代码存档
- spring-boot-actuator - 用于删除弹簧执行器网关路由的 API 不起作用?
- vue.js - 在 pm2 中添加 SSL 认证
- ios - Flutter(Objective-C)相机:处理和显示处理后的实时预览 cvPixelBuffer 不起作用?
- php - 如何从 symfony 表单字段中获取 ID 以填写表单的其余部分
- postgresql - 无法将 CSV 数据导入 Cloud SQL 数据库