对 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