当 C++ 程序意外退出,还没有及时清理的指针应该如何处理

最近在写串的时候总会遇到这样的问题,调试的时候程序意外退出,导致后面申请的 char * 数组带有之前的元素

比如

auto *arr {new char[10]};        //arr = ""
for(auto i {0}; i < 10; ++i) {
    arr[i] = 'a' + i;        //arr = "abcdefghij"
}

当程序意外退出的时候,arr 可能没有来得及释放,导致下一次申请数组的时候,就算只申请 5 个空间,当遇到刚好内存相同的时候,新的数组就会是 "abcdefghij"

auto *arr {new char[5]};        //当内存没来得及释放,arr = "abcdefghij"

之前尝试过在新的程序开始之前,用老的程序申请一个很大的空间并且释放

#include <iostream>
int main(int argc, char *argv[]) {
    auto *arr {new char[100000]};
    delete []arr;
    return 0;
}

但是只有第一次释放之后是正常的,接下来又会出现上面的情况
如果遇到这种情况,各位有什么好的解决方案吗?

阅读 5k
4 个回答

C/C++ 中,读取一个未赋值(且没有定义默认值)的量是未定义行为

未定义行为是错误的行为。

正确的写法是

auto *arr {new char[10]};
memset(arr, 0, sizeof(*arr) * 10);

// 此时数组 arr 的内容皆为 0

/* ... */
新手上路,请多包涵

C++中不建议使用裸指针,最好使用shared_ptr或者unique_ptr

进程退出后,整个内存空间都会释放。所以不用做任何处理。

另外 C++ 提倡用std::vectorstd::array。程序正常运行时,std::vector申请的空间会在析构时自动释放,崩溃的情况同上。

两个进程的内存空间应该看成独立的。即使映射到了相同的物理地址,也不应该有所假设。

你应该是for循环中,依然赋值了10个,然后分配的大小是5个。实际上并不存在你说的那个。程序退出后,改进程的相关内存会被释放,不会出现你描述的情景。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题