Вы используете умные указатели, такие как 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
указатели (которые маскируют ошибки, которые в противном случае обнаруживаются, как красиво показывает этот вопрос), но никто не предлагает просто вообще не выполнять ручное управление памятью, что очень хорошо возможно в C ++. Я не писалdelete
годами. (И да, мой код критичен к производительности. В противном случае он не был бы написан на C ++.)