删除数组内指针触发malloc错误,请求技术排查与解决
错误原因与解决方案
问题根源
- 执行
delete array[i]时,array[i]指向的是栈内存中的val[i]。delete只能用于释放通过new(或new[])在堆上分配的内存,手动释放栈内存会触发系统报错。 - 额外错误:
delete[] array也是错误操作,因为int* array[max]是栈上声明的指针数组,同样不需要手动释放。
修正方案
根据需求,有两种正确处理方式:
方式1:使用动态堆内存(需手动释放)
如果需要动态分配内存,修改指针赋值逻辑,用new创建每个元素:
#include <iostream> #include <random> #include <ctime> using namespace std; int main() { default_random_engine gen(time(0)); uniform_int_distribution<> dis(1, 100); const int max = 20; int* array[max]; // 为每个指针分配堆内存并初始化 for (int i = 0; i < max; i++) { array[i] = new int(dis(gen)); } //... 对array的修改操作 // 输出数组内容 for (int i = 0; i < max; i++) { cout << *array[i] << " "; } // 正确释放每个堆内存对象 for (int i = 0; i < max; i++) { delete array[i]; } return 0; }
方式2:使用栈内存(无需手动释放)
如果只是用指针指向栈数组元素,不需要任何手动释放操作,栈内存会在作用域结束时自动回收:
#include <iostream> #include <random> #include <ctime> using namespace std; int main() { default_random_engine gen(time(0)); uniform_int_distribution<> dis(1, 100); const int max = 20; int* array[max]; int val[max]; for (int i = 0; i < max; i++) { val[i] = dis(gen); } for (int i = 0; i < max; i++) { array[i] = &val[i]; } //... 对array的修改操作 // 输出数组内容 for (int i = 0; i < max; i++) { cout << val[i] << " "; } // 无需任何delete操作 return 0; }
关键规则
- 配对使用:
new对应delete,new[]对应delete[],只能释放堆上分配的内存。 - 栈内存自动管理:局部变量、栈数组的内存由系统在作用域结束时自动释放,禁止手动调用
delete。
内容的提问来源于stack exchange,提问作者Christophe Martin
相关产品推荐
相关产品推荐

