动态数组内存释放疑问:delete替代delete[]可行吗?释放后能否访问?
问题解答
1. 使用delete而非delete[]释放new[]创建的数组能否正确释放?
这属于未定义行为,具体表现分两种场景:
- 针对
int、char这类内置数据类型:表面上内存可能会被释放,但这只是编译器的巧合行为,C++标准并未保证该操作的正确性,不同编译器或运行环境下可能出现内存泄漏、程序崩溃等问题。 - 针对带自定义析构函数的类对象数组:
delete只会调用数组第一个元素的析构函数,其余元素的析构函数不会被执行,会导致资源泄漏;同时内存释放的流程也不符合数组分配的规则,极易引发内存错误。
2. delete[] ptr1后,通过同地址的ptr2访问原数组是否可行?
绝对不行。执行delete[]后,该内存区域已被操作系统回收,ptr2成为悬垂指针。此时访问ptr2指向的内容属于未定义行为,读取到垃圾值是典型表现——内存可能已被重新分配给其他变量使用,原数组的数据早已被覆盖或销毁。
内容的提问来源于stack exchange,提问作者GA Haroon
相关产品推荐
相关产品推荐

