C ++在带有float数组的结构的2D-Vector上使用delete

时间:2011-03-23 22:33:28

标签: c++ memory-management

我有这样的结构:

struct foo {

  int a,b,c;

  float d; 

  float *array1;

  float *array;

}; 

现在我将这个结构用于8x8 2D-Vector,如下所示:

vector< vector<foo> > bar(8);
for (int i = 0; i < 8; i++)
    bar[i].resize(8);

在我的程序中,“bar”现在填充了数据,例如:

bar[1][5].array1 = new float[256];
bar[1][5].array2 = new float[256];
// Et cetera.

如何正确释放条形码使用的内存?

我尝试了一个for循环来释放每个浮点数组,如下所示:

delete [] bar[i][j].array1;

但是这会导致运行时出现堆异常。

6 个答案:

答案 0 :(得分:2)

struct添加析构函数以清理这些成员。

或者你可以像EduardoLeón所建议的那样将它们作为结构的一部分进行分配。

float array1[256];

而不是

float *array1;

答案 1 :(得分:2)

首先,您应该使用vector<float>代替float*arrays are evil

其次,你释放记忆的方式是正确的,错误必须在其他地方。

答案 2 :(得分:1)

您可以发布实际的代码片段吗?如果你只是删除你正在分配的元素,那么应该没有问题。

我建议做一些事情来缩小范围:

  1. 在初始化
  2. 上为所有指针指定NULL
  3. 使用shared_ptr类型而不是原始浮点指针 - 当没有引用时,这些将自动清除。

答案 3 :(得分:1)

我建议您使用适合您需要的矢量或其他stl容器。

如果必须是数组 - 最好在结构中使用析构函数,这样就不必考虑手动清理:

  struct foo
  {
    int a,b,c;
    float d; 
    float *array1;
    float *array2;

     foo ()
        : a(0),
        b(0),
        c(0),
        d(0.0),
        array1(NULL),
        array2(NULL)
     { }

     ~foo ()
     {
        delete [] array1;
        delete [] array2;
     }
  }; 

编辑:删除delete []

上的NULL检查

答案 4 :(得分:0)

您必须将此析构函数添加到struct foo:

~foo() {
  delete []array1;
  delete []array2;
}

我建议你为foo创建一个构造函数,将这两个指针初始化为0:

foo()
:a(0),b(0),c(0),
 d(0.0), array1(0), array2(0)
{}

答案 5 :(得分:0)

实现此目的的最简单方法是创建构造函数和析构函数:

struct foo {

  int a,b,c;
  float d; 
  float *array1;
  float *array;

  foo()
  {
    array1 = array = 0;
  }

  ~foo()
  {
    delete [] array1;
    delete [] array;
  }

};

更好的是成员跟踪array1&amp;的大小。数组,以便复制构造函数和/或赋值运算符可以根据需要克隆它们。

注意:“最简单”我并不是指“最好”。 :)