2015-07-07 2 views
0

Если у меня есть два динамических массивов в качестве частных элементов данных:Multiple удалить в деструкторе

std::string* first_array; 
std::string* second_array; 

Я знаю, что я могу просто удалить, как это в деструкторе

myClass::~myClass() 
{ 
    delete[] first_array; 
    delete[] second_array; 
} 

Обеспокоенность у меня есть это, не все время у меня есть данные внутри обоих массивов, так что-то вроде этого считается лучшей практикой?

myClass::~myClass() 
{ 
    if(first_array) 
     delete[] first_array; 
    if(second_array) 
     delete[] second_array; 
} 

Я пробовал и то и другое, и то, и другое работал, не уверен, какой из них лучше с точки зрения производительности.

+5

1) вызов delete по значению нулевого указателя приводит к NOP (No-Operation) и является абсолютно допустимым, приемлемым и обычно предпочтительным. 2) Вместо этого используйте 'std :: vector'. Нет, серьезно, ** используйте **. –

+0

Да, я знаю «std :: vector», это для учебных целей. – hello

+2

Возможный дубликат [Есть ли какие-либо причины для проверки указателя NULL перед удалением?] (Http://stackoverflow.com/questions/615355/is-there-any-reason-to-check-for-a-null- указатель перед удалением) –

ответ

6

Стандарт C++ указывает, что вызов delete по значению нулевого указателя приведет к NOP (No-Operation). Это совершенно допустимо, приемлемо и, как правило, предпочтительнее.

0

Удаление указателя, который может быть NULL, в порядке. Как уже было сказано другими, вызов delete по NULL-указателю приводит к NOP.

Однако, после удаления любого указателя, вне зависимости от того, где, почему, как и когда, вы должны сразу назначить указатель на NULL. Несоблюдение этого может привести к случайному двойному удалению указателя, что катастрофически плохо для вашей программы (https://isocpp.org/wiki/faq/freestore-mgmt#double-delete-disaster).

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

+0

_ «вам следует сразу же присвоить указателю NULL» _ - Ум да нет. Это довольно бессмысленно делать в деструкторе, так как попытка удалить объект дважды - это уже неопределенное поведение. –

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