我在C ++中有一个指向Object的三重指针,我需要在使用后释放整个东西。
MyClass *** foobar = new MyClass **[10000];
如何为此编写删除语句。
答案 0 :(得分:6)
这取决于你如何分配指针指针。如果你这样做:
int x;
int* p = &x;
int** pp = &p;
int*** ppp = &pp;
然后你没有delete
任何东西。
另一方面,如果你这样做:
int* p = new int;
int** pp = &p;
int*** ppp = &pp;
然后你只需要delete p
。为:
// i.e., allocate 1000 ints, return a pointer, and then get the address of that pointer
int** pp = &(new int[1000]);
// Oh, and get the address of the int**
int*** ppp = &pp;
您必须delete[] *pp
(即取消引用pp
以获取指向int
s数组的原始指针,然后delete[]
数组)。
答案 1 :(得分:2)
你如何分配它?通常,如果A是指向B的指针,B是指向C的指针而C指向D(数据),则需要释放D,然后将C和B作为最后一个。
答案 2 :(得分:2)
您new[]
的任何内容,都必须delete[]
。就这么简单。
如果您在多个级别执行此操作,则必须按delete[]
的相反顺序new[]
。
答案 3 :(得分:1)
如果您所做的唯一分配是您在问题中显示的分配,那么您只需要这样做:
delete [] **foobar;
因为那是实际获得的唯一记忆。如果已为foobar
内的元素分配了内存,则必须按创建的相反顺序清除它们。
请注意,在大多数情况下,可以简化这些类型的结构。例如,如果要保留的实际数据是多维数据集,则可以分配单个1000*1000*1000
元素块(这些元素数量很大)并使用单个delete []
取消分配。如果将内存包装在类中,则可以提供operator()
,它将从三个索引映射到顺序容器中的唯一元素。看一下C ++ FAQ lite here。
答案 4 :(得分:0)
3D内存分配
int ***allocate3D(int ***mat, int k, int l, int m) {
mat = (int***) malloc( sizeof(int)*k*l*m );
for(int i=0;i<k;i++)
mat[i] = (int**) malloc ( sizeof(int)*l*m );
for(int i=0; i<k; i++) for(int j=0; j<l; j++)
mat[i][j] = (int*) malloc ( sizeof(int)*m );
return mat;
}
3D矩阵释放:
void deAllocate3D(int ***mat, int k, int l, int m){
//Delete in reverse order of allocation
for(int i=0; i<k; i++) for(int j=0; j<l; j++) { free(mat[i][j]); mat[i][j] = NULL; }
for(int i=0; i<k; i++) { free(mat[i]); mat[i] = NULL; }
free(mat); mat = NULL;
}
查找完整的源代码here