Используете ли вы умные указатели, такие как Boost shared_ptr
? Если это так, проверьте, не используете ли вы где-нибудь необработанный указатель, вызвав get()
. Я обнаружил, что это довольно распространенная проблема.
Например, представьте сценарий, в котором необработанный указатель передается (скажем, в качестве обработчика обратного вызова) вашему коду. Вы можете решить присвоить это интеллектуальному указателю, чтобы справиться с подсчетом ссылок и т. Д. Большая ошибка: ваш код не владеет этим указателем, если вы не сделаете глубокую копию. Когда ваш код завершен с помощью умного указателя, он уничтожит его и попытается уничтожить память, на которую он указывает, поскольку он думает , что это больше никому не нужно, но вызывающий код затем попробуйте удалить его, и вы получите двойную бесплатную проблему.
Конечно, это не может быть вашей проблемой здесь. Вот самый простой пример, который показывает, как это может произойти. Первое удаление в порядке, но компилятор чувствует, что он уже удалил эту память и вызывает проблему. Вот почему присвоение 0 указателю сразу после удаления является хорошей идеей.
int main(int argc, char* argv[])
{
char* ptr = new char[20];
delete[] ptr;
ptr = 0; // Comment me out and watch me crash and burn.
delete[] ptr;
}
Редактировать: изменено delete
на delete[]
, так как ptr является массивом char.