Удалить ошибку памяти - PullRequest
       65

Удалить ошибку памяти

1 голос
/ 04 марта 2010

У меня есть следующий сценарий,

class foo
{
  ...
  private:
   char *_test;
};

void foo::setTest()
{
  if( 0 != _test ) delete [] _test;
}

Функция setTest выдает ошибку при вызове, поскольку она пытается удалить _test, когда она еще не была назначена. Это происходит потому, что _test не установлен на 0X0.

Может ли кто-нибудь помочь мне понять это?

Ответы [ 3 ]

3 голосов
/ 04 марта 2010

Вы должны инициализировать _test с NULL в конструкторе.

Как:

foo:foo {
 _test = NULL;
}

Если вы не _test, будет иметь значение мусора.

ТакжеКак указал Крис, значение, переданное в качестве аргумента delete или (delete[]), должно быть либо указателем на блок памяти, ранее выделенный с помощью new, либо нулевым указателем ( в случае нулевого значения).указатель, удаление не дает никакого эффекта ), что делает вашу проверку NULL избыточной.

1 голос
/ 04 марта 2010

Есть две возможности:

Если вы никогда не инициализируете foo::_test, то эта переменная, скорее всего, будет содержать случайные данные при создании вашего класса. C ++ не инициализирует ваши указатели в null (в отличие от Java, C # или большинства других языков более высокого уровня). Вы должны всегда (ВСЕГДА!) Инициализировать ваши указатели на NULL или действительное значение. Измените на char *_test = NULL; или инициализируйте _test в вашем конструкторе.

Альтернативно, возможно, что _test удаляется в другом месте, которое не показано в вашем примере, но не установлено на NULL. Всякий раз, когда вы удаляете члена класса, вы должны впоследствии установить его на NULL, чтобы предотвратить проблему двойного освобождения.

1 голос
/ 04 марта 2010

Ну, если _test не было присвоено какое-либо значение, то оно имеет неопределенное значение. Вы не можете использовать это значение ни для чего, если хотите нормальное поведение. Переменные должны быть назначены перед использованием.

Кстати, delete и delete[] безопасны для вызова по нулевым указателям, поэтому проверка == 0 является избыточной.

...