Чи використовуєте ви розумні покажчики, такі як Boost shared_ptr
? Якщо так, перевірте, чи ви прямо використовуєте де-небудь сирий вказівник, зателефонувавшиget()
. Я виявив, що це досить поширена проблема.
Наприклад, уявіть сценарій, коли необроблений вказівник передається (можливо, як обробник зворотного виклику, скажімо) до вашого коду. Ви можете вирішити призначити це розумному вказівнику, щоб впоратися з підрахунком посилань тощо. Велика помилка: ваш код не є власником цього вказівника, якщо ви не зробите глибоку копію. Коли ваш код закінчується за допомогою розумного вказівника, він знищить його та спробує знищити пам’ять, на яку він вказує, оскільки вважає, що це нікому не потрібно, але викличний код спробує видалити його, і ви отримаєте подвійний безкоштовна проблема.
Звичайно, це може бути не ваша проблема тут. Найпростіше, ось приклад, який показує, як це може статися. Перше видалення - це нормально, але компілятор відчуває, що ця пам’ять вже видалено і викликає проблему. Ось чому присвоєння покажчику 0 відразу після видалення є гарною ідеєю.
int main(int argc, char* argv[])
{
char* ptr = new char[20];
delete[] ptr;
ptr = 0;
delete[] ptr;
}
Редагувати: змінено delete
на delete[]
, оскільки ptr - це масив символів.
NULL
покажчики (що маскує помилки, які в іншому випадку вловлюються, як це прекрасно показує це питання), але ніхто не пропонує просто взагалі не робити ручне управління пам’яттю, що дуже добре можливо в С ++. Яdelete
роками не писав . (І так, мій код є критично важливим для продуктивності. Інакше його не писали б на C ++.)