2012-04-23 3 views
0

В моем приложении я выделил память для моей переменной (unsigned char*), используя malloc(), когда пытаюсь освободить эту память в деструкторе. Я использую это условие, чтобы избежать двойного повреждения.Освобождение памяти в linux C++?

unsigned char *wsqData; 
wsqData= (unsigned char *)malloc(10000*sizeof(unsigned char)); 

в моем деструкторе

if(wsqData!=NULL) 
    { 
     free(wsqData); 
     wsqData=NULL; 
    } 

теперь проблема, когда я освободил память до моего деструктора, это «если условие» не может работать должным образом, это еще раз попытаться освободить эту переменную его причину ошибка двойного повреждения. В чем проблема в этом сценарии?

+3

Почему вы используете управление памятью C в том, что предположительно является программой на C++? –

+1

Если вы пытаетесь что-то освободить дважды, у вас есть ошибка в коде. Вы не указали свой код, поэтому вам трудно посоветовать ... –

+2

Почему вы освобождаете память в разных местах? –

ответ

5

Вызов free В память не устанавливается автоматический указатель на NULL, поэтому ваше состояние бессмысленно. Вам необходимо установить wsqData в NULL, где бы вы его не освободили.

Конечно, условие бессмысленно в любом случае, так как звонок бесплатный на указателе NULL гарантированно будет в безопасности.

3

Вам необходимо установить wsqData в NULL в момент, когда вы освободите память вне деструктора. Но в C++ вы должны использовать new и delete. И старайтесь избегать освобождения памяти в любом месте, кроме деструктора.

0

Как и другие, вам также необходимо установить значение NULL каждый раз, когда вы его освободите. Сделайте это функцией - освободите переменную, затем установите ее в NULL и вызовите ее как из деструктора, так и из любого места в программе.

0

FYI: Это классический пример dangling pointer. Вам необходимо установить wsqData на NULL, как и было предложено.

Смежные вопросы