我正在使用上面的代码来动态分配数组,在函数内部做一些工作,返回数组的元素并释放函数外部的内存。但是当我尝试释放数组时,它不会释放内存,而且我有内存泄漏。指向myArray变量的调试器向我显示错误CXX0030。为什么呢?
struct MYSTRUCT
{
char *myvariable1;
int myvariable2;
char *myvariable2;
....
};
void MyClass::MyFunction1()
{
MYSTRUCT *myArray= NULL;
MYSTRUCT *myElement = this->MyFunction2(myArray);
...
delete [] myArray;
}
MYSTRUCT* MyClass::MyFunction2(MYSTRUCT *array)
{
array = (MYSTRUCT*)operator new(bytesLength);
...
return array[X];
}
答案 0 :(得分:5)
您应该使用delete[]
的唯一时间是您已分配new[]
,但这不是您正在做的事情。您正在使用operator new
,这不是您应该用于通用数组分配的。请改用new[]
。或使用矢量。
此外,虽然您将myArray
传递给MyFunction2
作为array
,然后在函数内为array
分配一个新值,但不会更改{的值{1}}在来电者中。该变量保留其原始空值,因此您的myArray
调用不执行任何操作。您可以将delete[]
更改为按引用而不是按值传递,因此对其的更改将反映在调用方的实际参数中。
答案 1 :(得分:3)
您在MyFunction2
中分配数组,但不返回其地址。 MyFunction2
的参数是按值计算的,因此在调用它时会将myArray
的副本传递给它,但函数本身永远不能更改调用者局部变量的值。
对您的问题的简单而明显的答案是将MyFunction2
的参数声明为参考,例如:
MYSTRUCT* MyClass::MyFunction2(MYSTRUCT*& array)...
然而,更好的解决方案是使用std::vector
,而不用担心解除分配。
答案 2 :(得分:1)
您在MyFunction2
内部分配数组并且永远不会释放它。在MyFunction1
你delete[]
空指针,这是一个无操作。我不确定我能告诉你你应该做些什么,因为你的意图并不清楚。