所以我习惯于在C中进行内存管理,其中free(pointer)
将释放pointer
指向的所有空间。现在,当我尝试用C ++做一些简单的事情时,我会感到困惑。
如果我有一个以类似于此
的方式分配的二维2D数组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
解除分配?
答案 0 :(得分:13)
实际上,指针指向的指针数组仍然是用于保存内存地址的整数数据类型或数字的数组。你应该使用delete[]
。
另外,是的,new[]
表示delete[]
。
当您创建数组阵列时,您实际上正在创建一个数字数组,这些数字恰好包含另一个数字数组的内存地址。无论如何,它们都是数字数组,因此请使用delete[]
删除它们。
http://coliru.stacked-crooked.com/a/8a625b672b66f6ce
#include <iostream>
int main() {
//Hey, pointers have a finite size, no matter the indirection level!
std::cout << "sizeof(int*): " << sizeof(int*) << std::endl;
std::cout << "sizeof(int**): " << sizeof(int**) << std::endl;
std::cout << "sizeof(int***): " << sizeof(int***) << std::endl;
//Create an array of pointers that points to more arrays
int** matrix = new int*[5];
for (int i = 0; i < 5; ++i) {
matrix[i] = new int[5];
for (int j = 0; j < 5; ++j) {
matrix[i][j] = i*5 + j;
}
}
//Print out the matrix to verify we have created the matrix
for (int j = 0; j < 5; ++j) {
for (int i = 0; i < 5; ++i) {
std::cout << matrix[j][i] << std::endl;
}
}
//Free each sub-array
for(int i = 0; i < 5; ++i) {
delete[] matrix[i];
}
//Free the array of pointers
delete[] matrix;
return 0;
}