删除动态分配的二维数组
Deleting a dynamically allocated 2D array
所以我习惯了 C 中的内存管理,其中 free(pointer)
将释放 pointer
指向的所有 space。现在我在尝试用 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[]
。
此外,是的,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;
}
所以我习惯了 C 中的内存管理,其中 free(pointer)
将释放 pointer
指向的所有 space。现在我在尝试用 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[]
。
此外,是的,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;
}