【发布时间】:2015-08-23 14:17:17
【问题描述】:
所以我习惯了 C 中的内存管理,free(pointer) 将释放pointer 指向的所有空间。现在,当我尝试在 C++ 中做一些简单的事情时,我感到很困惑。
如果我有一个以类似方式分配的二维双精度数组
double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
atoms[i] = new double[4];
释放new分配的堆上的内存的正确方法是什么?
我最初的想法是这样的(因为我的大脑是用 C 语言思考的):
for(int i = 0; i < 1000; i++)
delete atoms[i];
delete atoms;
但是我忘记了delete[]运算符的存在所以我相信正确的方法如下:
for(int i = 0; i < 1000; i++)
delete[] atoms[i];
delete[] atoms;
了解delete 和delete[] 运算符之间的区别是否重要?或者我可以假设每当我用ptr = new x[] 分配一个数组时,我也必须用delete[] ptr 释放它?
【问题讨论】:
-
带有
delete []的版本有效。如果你为非数组对象调用delete [],它就是一个ub。您可以在其他 SO 问题中看到:stackoverflow.com/questions/4255598/delete-vs-delete -
谢谢,由于某种原因,我很难找到这样的帖子......但这几乎可以解决问题。我将此标记为该问题的重复项
标签: c++ memory-management delete-operator