对 delete *ptr 的理解(释放内存、空悬指针、重复释放)

对 delete *ptr 的理解:

(1)delete 只是表示“将内存资源还给系统”,当下次程序再调用new申请内存的时候,系统就可以将这块内存重新分配给使用者;
(2)而实际上调用delete *ptr; 之后,当前程序仍可以操作 *ptr指向的这块内存,这个指针也一直存在(“空悬指针”);
(3)如果再次对 ptr调用delete(重复释放),则程序将会core dump(理由是此时ptr可能是其他程序正在使用的一块新内存,旧程序不应该对其释放);
(4)所以正确的做法应该是在 delete后将 ptr指针置为空,这样的好处是避免改写
ptr内存上的内容,且delete nullptr;释放一个空指针不会引发程序错误。

访问一个 null空指针将会引发 段错误,delete释放一个空指针则不会。

示例一:

#include <iostream>
using namespace std;

int main() {

	int *ptr = new int(10);

	cout << ptr << ' ' << *ptr << endl;

	delete ptr;

	cout << ptr << ' ' << *ptr << endl;

	return 0;
}

输出结果:

0x7f9a88405800 10
0x7f9a88405800 10

示例二:

#include <iostream>
using namespace std;

int main() {

	int *ptr = new int(10);

	cout << ptr << ' ' << *ptr << endl;

	delete ptr;

	ptr = nullptr;

	cout << ptr << endl; //cout<<*ptr; 访问空指针将会引发段错误

	return 0;
}

输出结果:

0x7ff715405800 10
0x0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值