1。delete完new分配的对象后,没有将其手动置为nullptr。
在C++中,使用delete操作符释放通过new分配的内存时,不会自动将指针设置为nullptr(或NULL)。这意味着指针在删除后仍然指向原来的内存地址,尽管这块内存已经被标记为可再次分配。访问这样的指针会导致未定义行为,因为所指向的内存可能已经被分配给其他数据,或者已经被操作系统回收。
因此,作为一种良好的编程实践,在对指针使用delete之后,应该手动将其设置为nullptr。
int* p = new int(10);
delete p;
p = nullptr; // 手动将指针设置为空,避免悬挂指针问题
这样做有助于防止悬空指针的问题,并且在尝试访问或删除一个已经设为nullptr的指针时,程序的行为是定义好的(即不会导致段错误等),尽管这并不能解决所有与内存管理相关的问题。例如,尝试删除一个nullptr指针是安全的,delete操作会直接返回而不进行任何操作。
拓展
在C++中,“删除一个指针”实际上指的是释放指针所指向的内存,而不是删除指针变量本身。指针本身是一个局部或全局变量,它存储的是内存地址,而“删除”操作是通过delete(对于用new分配的单个对象)或delete[](对于用new[]分配的数组)来释放指针所指向的那块内存。
以下是具体的操作步骤:
1、释放单个对象的内存:如果你使用new分配了一个单独的对象,则应使用delete来释放它。
int* p = new int(10); // 分配一个整数并初始化为10
delete p; // 释放p指向的内存
p = nullptr; // 可选:将指针置空,避免悬空指针问题
2、释放数组的内存:如果你使用new[]分配了一个数组,则必须使用delete[]来释放这个数组。
int* arr = new int[10]; // 分配一个包含10个整数的数组
delete[] arr; // 使用delete[]释放数组
arr = nullptr; // 可选:同样推荐将指针置空
重要的是要注意,使用delete和delete[]时要与分配内存时使用的new和new[]相对应。如果对用new[]分配的数组使用delete,或者对用new分配的对象使用delete[],会导致未定义行为。
此外,正如之前提到的,虽然不是必须的,但在释放内存后将指针设置为nullptr是一种良好的实践,可以防止出现悬空指针的问题,并有助于提高代码的安全性和可维护性。