动态内存分配技术疑问:指针赋值与内存释放相关问题
int *firstArray = new int[10]; int *secondArray = new int[20]; firstArray = secondArray;
问题解答
1. 尽管两个数组大小不同,表达式firstArray = secondArray;是否安全?
语法上合法,所以编译器不会报错,但逻辑上完全不安全:
- 赋值后,
firstArray原本指向的10个int的内存块会彻底丢失,再也无法释放,直接造成内存泄漏。 - 就算后续通过
firstArray访问更大的数组范围,这种行为本质是依赖未定义的指针操作,绝非安全的写法。
2. 当firstArray与secondArray指向同一地址时,若释放其中一个数组,另一个是否也会被释放?
是的,两个指针现在指向同一块内存区域。释放其中任意一个,这块内存就会被操作系统回收。此时另一个指针就变成了野指针——它的地址值没变,但指向的内存已经无效了。
3. 为何释放第二个数组时应用程序会崩溃?
核心原因是重复释放同一块内存:
- 如果你先释放了
firstArray,那secondArray指向的内存已经被回收。这时候再释放secondArray,就是对已经归还给系统的内存执行二次释放,属于C++中的未定义行为,操作系统会直接终止程序,导致崩溃。
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

