C++中非指针数组无法使用delete释放的正确内存释放方法
C++ 栈数组的内存管理规则
两种数组声明的内存分配逻辑存在本质区别,对应内存释放规则完全不同:
- 堆动态数组:
int* test = new int[50];的写法是在自由存储区(堆)申请内存,生命周期由开发者手动控制,必须配对使用delete[] test;释放,否则会造成内存泄漏。 - 栈固定长度数组:
int test[50];的写法是在程序栈空间申请内存,生命周期由作用域规则自动管理,不需要编写任何手动释放的代码。当代码执行离开该数组定义所在的作用域(例如数组定义在函数内时函数返回、定义在局部代码块内时代码块执行完毕),其占用的栈空间会被系统自动回收。
警告:对栈上分配的变量、数组使用
delete或delete[]属于未定义行为,会触发程序崩溃、内存损坏等不可预期的错误。
代码中用到的dist4是随机数生成逻辑,仅负责给数组元素赋值,和数组本身的内存管理规则无关,对应实现如下:
random_device dev; mt19937 rng(dev()); uniform_int_distribution<mt19937::result_type> dist4(1,4); // 分布范围为[1,4]
只有当你需要手动控制数组生命周期(比如数组需要在定义它的作用域结束后继续被访问)时,才需要使用new[]/delete[]配对的堆分配方式;如果数组仅在当前作用域内使用,直接使用栈声明的写法即可,无需额外处理内存释放。
内容的提问来源于stack exchange,提问作者Fabrice Schöneberger
相关产品推荐
相关产品推荐

