C++中的删除操作

3

我不明白 delete 的含义。

例如,在下面的代码中,delete ptr;是删除了 指针变量ptr 还是删除了 ptr所指向的内存

int *ptr = new int; 
*ptr = 7;  
delete ptr; 

2
指针所指向的内存已被删除 - yms
那么现在就没有7了,对吧? - GigiWithoutHadid
2
可能仍然存在一个 7,但它所占用的空间将在长期内被进一步分配重用,因此它的日子已经被数过了。 - Frédéric Hamidi
7
也许再读一遍这本书。 - Ed Heal
1个回答

11

指针变量ptr被删除还是指针ptr指向的内存被删除?

ptr所指向的内存被删除(即被标记为可用 - 内容仍然可能存在,但根据@JonTrauntvein所提到的,根据实现方式,该内存也可能被覆盖为特定的模式 - 删除后永远不应再访问)。

指针本身不会改变,仍然包含相同的值(即它指向的内存地址),但在删除后将指针null是一个好习惯,例如ptr = NULL;

这块内存是使用new int从堆上分配的,因此应始终使用delete释放。


int *ptr = new int; 

- 在堆上分配了内存 - 数量为:sizeof(int) - ptr 指向该内存位置。

*ptr = 7;  

-> 分配的内存中存储了值为7

-> The value 7 is stored in the allocated memory.
delete ptr; 

分配的内存(包含7)被释放(即标记为空闲以供其他用途)。 ptr 仍然指向该释放的内存位置。访问它是无效的,因此指针应设置为NULL


2
指针变量 ptr 在调用 delete 后仍然具有相同的值,只是不再指向一个 int - David Schwartz
@DavidSchwartz - 确实 - 添加了一些额外的信息。 - Danny_ds
2
不能保证在调用delete之前指向的内存不会被delete操作符修改。一些实现,例如Visual C++调试运行时库,会使用可识别的模式覆盖内存,有时可以帮助识别您是否正在尝试访问已删除的内存。 - Jon Trauntvein
1
@JonTrauntvein - 没错。已经添加到帖子中了 - 谢谢。 - Danny_ds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接