C++ 删除动态分配的二维数组
所以我习惯于C语言中的内存管理,其中C++ 删除动态分配的二维数组,c++,memory-management,delete-operator,C++,Memory Management,Delete Operator,所以我习惯于C语言中的内存管理,其中空闲(指针)将释放指针所指向的所有空间。现在我在试图做一些简单的C++时困惑了自己。 如果我有一个二维数组,它是以类似的方式分配的 double** atoms = new double*[1000]; for(int i = 0; i < 1000; i++) atoms[i] = new double[4]; 理解delete和delete[]运算符之间的区别是否重要?或者我可以假设,每当我分配一个带有ptr=new x[]的数组时,我还必须用
空闲(指针)
将释放指针所指向的所有空间。现在我在试图做一些简单的C++时困惑了自己。
如果我有一个二维数组,它是以类似的方式分配的
double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
atoms[i] = new double[4];
理解delete
和delete[]运算符之间的区别是否重要?或者我可以假设,每当我分配一个带有ptr=new x[]
的数组时,我还必须用delete[]ptr
解除分配它?实际上,指针指向的指针数组仍然是一个整数数据类型或数字数组,用于保存内存地址。您应该同时使用delete[]
另外,是的,new[]
意味着delete[]
当您创建一个数组时,实际上是在创建一个数字数组,该数组恰好包含另一个数字数组的内存地址。无论如何,它们都是数字数组,所以请使用delete[]
删除这两个数组
#包括
int main(){
//嘿,指针的大小是有限的,不管是间接级别!
std::cout带有delete[]
的版本有效。如果调用delete[]
对于非数组对象,它是一个ub。你可以在其他SO问题中看到:谢谢,出于某种原因,我很难找到这样的帖子……但这就很清楚了。我将此标记为该问题的副本只是为了清楚,指针的类型不一定是int
或long
或任何其他类型。该标准定义了可以强制转换为算术类型的特定类型:std::intptr\u t
和std::uintptr\u t
。由于大小不同(如果您可以想象一个奇怪的体系结构,其中指针是双),可能会有一些非常奇怪的东西,int
和std::intptr\u t
可能有不同的大小(例如32位int
和64位std::uintptr\u t
值)。
for(int i = 0; i < 1000; i++)
delete atoms[i];
delete atoms;
for(int i = 0; i < 1000; i++)
delete[] atoms[i];
delete[] atoms;
#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;
}