Динамически распределенный массив не освобождается - PullRequest
1 голос
/ 28 ноября 2011

Я использую код выше для динамического выделения массива, выполнения некоторой работы внутри функции, возврата элемента массива и освобождения памяти вне функции Но когда я пытаюсь освободить массив, он не освобождает память, и у меня возникает утечка памяти. Отладчик, указывающий на переменную 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 ]

5 голосов
/ 28 ноября 2011

Единственный раз, когда вы должны использовать delete[], это когда вы выделяете new[], но это не то, что вы делаете. Вы используете operator new, а это не то, что вы должны использовать для общего назначения массивов. Вместо этого используйте new[]. Или используйте вектор.

Кроме того, хотя вы передаете myArray в MyFunction2 как array, а затем присваиваете новое значение для array внутри функции, которое не меняет значение myArray в вызывающей стороне. Эта переменная сохраняет свое исходное нулевое значение, поэтому ваш вызов delete[] ничего не делает. Вы можете изменить array так, чтобы он передавался по ссылке, а не по значению, поэтому изменения в нем будут отражены в его фактическом параметре в вызывающей стороне.

3 голосов
/ 28 ноября 2011

Вы выделяете массив в MyFunction2, но не возвращаете его адрес. Аргументом MyFunction2 является значение, поэтому вы передаете ему копию myArray при вызове, но сама функция никогда не сможет изменить значение локальной переменной вызывающего.

Простой и очевидный ответ на вашу проблему заключается в объявлении параметра MyFunction2 в качестве ссылки, например ::

MYSTRUCT* MyClass::MyFunction2(MYSTRUCT*& array)...

Однако гораздо лучшим решением было бы использовать std::vector, а не беспокоиться об освобождении.

1 голос
/ 28 ноября 2011

Вы выделяете массив внутри MyFunction2 и никогда не освобождаете его.А в MyFunction1 you delete[] указатель NULL, который не используется.Я не уверен, что могу сказать вам, что вы должны были сделать, потому что ваши намерения не ясны.

...