我有这样的结构:
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;
但是这会导致运行时出现堆异常。
答案 0 :(得分:2)
向struct
添加析构函数以清理这些成员。
或者你可以像EduardoLeón所建议的那样将它们作为结构的一部分进行分配。
float array1[256];
而不是
float *array1;
答案 1 :(得分:2)
首先,您应该使用vector<float>
代替float*
,arrays are evil。
其次,你释放记忆的方式是正确的,错误必须在其他地方。
答案 2 :(得分:1)
您可以发布实际的代码片段吗?如果你只是删除你正在分配的元素,那么应该没有问题。
我建议做一些事情来缩小范围:
答案 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 []
答案 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;的大小。数组,以便复制构造函数和/或赋值运算符可以根据需要克隆它们。
注意:“最简单”我并不是指“最好”。 :)