未释放动态分配的数组

时间:2011-11-28 17:44:34

标签: c++ arrays pointers memory-leaks

我正在使用上面的代码来动态分配数组,在函数内部做一些工作,返回数组的元素并释放函数外部的内存。但是当我尝试释放数组时,它不会释放内存,而且我有内存泄漏。指向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];
}

3 个答案:

答案 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内部分配数组并且永远不会释放它。在MyFunction1delete[]空指针,这是一个无操作。我不确定我能告诉你你应该做些什么,因为你的意图并不清楚。