Проверка на пустой указатель в C ++ перед удалением - PullRequest
4 голосов
/ 02 октября 2010

У меня есть массив в C ++:

Player ** playerArray;

, который инициализируется в конструкторе класса, в котором он находится.

В деструкторе у меня есть:

delete playerArray;

за исключением того, что при тестировании программы через Valgrind он говорит, что есть несколько вызовов для удаления в пустой указатель:

 operator delete(void*)

Я хочу проверить, является ли playerArray пустым указателем перед вызовом delete, чтобы избежать этой ошибки.

Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

5 голосов
/ 02 октября 2010

Возможно, вы имели в виду delete [] playerArray. Вам нужен [], если указатель является массивом, а не единственным экземпляром.

3 голосов
/ 02 октября 2010

Вот как определяется оператор delete.

void operator delete(void*) throw();
void operator delete[](void*) throw();

'оператор delete' принимает 'void *', поскольку указатель на любой объект может быть преобразован в 'void *'.

Обратите внимание, что пустота является неполным типом, и поэтому нельзя удалять пустоту * т.е.

char *p = new char;
void *pv = p;
delete pv;            // not allowed

Сноска 78: Это означает, что объект нельзя удалить с помощьюуказатель типа void *, потому что void не является типом объекта.

В случае, когда playerarray является указателем на массив Players, вы, скорее всего, захотите сделать это по-другому.delete pplayer не делает то, что вы хотите.

0 голосов
/ 02 октября 2010

Я думаю, что valgrind предупреждает, что удаление происходит в контексте чего-то подобного:

int foo(void *mydata){
{
    SomeClass some_value = static_cast<SomeClass> mydata;
    some_value.dosomething();
    // now we're done with it
    delete mydata;
}

хотя приведение в порядке, поскольку вы знаете, что указатель void на самом деле относится к этому типу, вы все равно делаете что-то подозрительное, потому что вы удаляете указатель void, а не типизированный указатель. Если SomeClass - это POD, это, вероятно, ok , но если у него есть какая-то критическая работа, которую он должен выполнить в своем деструкторе, этот деструктор никогда не будет вызван.

...