在c ++中删除三指针

时间:2011-03-22 06:35:11

标签: c++

我在C ++中有一个指向Object的三重指针,我需要在使用后释放整个东西。

MyClass *** foobar = new MyClass **[10000];

如何为此编写删除语句。

5 个答案:

答案 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