Ошибка отладки

Я продолжаю сталкиваться с этим"Debug assertions failed!" ошибка при запуске моей программы в режиме отладки. Я пытался найти эту ошибку на веб-сайте Visual C ++, но объяснения для меня слишком сложны, и они не имеют никакого сходства с тем, что я думаю о проблеме.

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

Есть идеи, что здесь происходит? Мои знания в программировании все еще относительно базовы.

Спасибо

Я использую Visual C ++ 2008.

Дополнительная информация:

Точка останова срабатывает в этом блоке кода:

 void operator delete(
    void *pUserData
    )
{
    _CrtMemBlockHeader * pHead;

    RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));

    if (pUserData == NULL)
        return;

    _mlock(_HEAP_LOCK);  /* block other threads */
    __TRY

        /* get a pointer to memory block header */
        pHead = pHdr(pUserData);

         /* verify block type */
        _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));//<---- break point triggers 

        _free_dbg( pUserData, pHead->nBlockUse );

    __FINALLY
        _munlock(_HEAP_LOCK);  /* release other threads */
    __END_TRY_FINALLY

    return;
}

Этот код с вкладки: dbgdel.cpp

Раздел моего кода, который я «сузил», который вызывает эту проблему, таков:

delete [] topQuadanglesPositions;
delete [] fourClamps;
delete [] precaculatedClamp1;
delete [] precaculatedClamp2;
delete [] precaculatedClamp3;
delete [] precaculatedClamp4;
delete [] area;
delete [] hullConfiguration;
delete [] output;
delete [] prunedListClamp1;
delete [] prunedListClamp2;
delete [] prunedListClamp3;
delete [] prunedListClamp4;
delete [] numValidLocations;

Если я закомментирую этот раздел, программа работает нормально.

 GManNickG20 сент. 2010 г., 21:59
Довольно сложно отлаживать код без какого-либо кода для отладки. Лучший вопрос, почему вы освобождаете вещи вручную. использованиеstd::vector.
 Faken20 сент. 2010 г., 22:03
@Diego: извините, я до сих пор не знаю правильную терминологию для вещей, но это часть кода, где я делаю это: delete [] tempArray; в самом конце раздела программы для очистки памяти больше не используется. @GMan и Стив: В будущем я больше не буду этого делать, но сейчас я уже написал программу из 11 тысяч строк кода, которая ее использует, так что нет смысла менять ее прямо сейчас.
 ybungalobill20 сент. 2010 г., 22:01
Зачем вам нужно «сужать точку», когда вы можете просто нажать кнопку «Break», когда сообщение появляется, и посмотреть в окно стека вызовов, чтобы увидеть, где именно оно произошло.
 Faken20 сент. 2010 г., 22:05
@ybungalobill: Когда я нажимаю «перерыв», это приводит меня к некоторому коду, который я не написал, и понятия не имею, что он дает.
 ybungalobill20 сент. 2010 г., 22:10
@ Верно. Когда вы попадете туда, откройте Debug-> Window-> Callstack (или что-то в этом роде), а затем дважды щелкните по элементам в списке, который появляется, чтобы увидеть, как ваша программа попала в этот код.
 Sam Miller20 сент. 2010 г., 22:07
если вы сузили область проблем, опубликуйте свой код! Мы не можем читать ваши мысли, помогите нам помочь вам.
 Steve Townsend20 сент. 2010 г., 22:45
Но поскольку вы решили взять на себя ненужное бремя управления собственной памятью, ваша программа уже состоит из новой / удаленной клейкой ленты, обертывающей бизнес-логику. Снимите клейкую ленту и оставьте логику, жизнь будет намного легче после этого. ОСОБЕННО, если вы учитесь. Сейчас настало время для формирования хороших привычек.
 GManNickG20 сент. 2010 г., 22:10
@Faken: Ваш код уже сломан, что вы можете потерять, сделав его чище и лучше? (И святой ад, который слишком много удаляет.)
 Faken20 сент. 2010 г., 22:22
@Gman: с моим уровнем мастерства многое может пойти не так даже с таким простым исправлением, как вы говорите. 99% программы работает, на самом деле 100% будет работать, если я закомментирую этот раздел кода, но это исправление с помощью клейкой ленты, которое я не хочу делать. Я не думаю, что в использовании new и delete есть что-то не так, просто лучше сделать это по-другому.
 Steve Townsend20 сент. 2010 г., 22:08
@ Факен - спорный. Это может быть быстрее пересмотреть ваше новое / удалить использование и заменить его, чем отлаживать то, что у вас есть сейчас. Также облегчает работу по техническому обслуживанию. Похоже, вы не рискуете сломать текущий код, поскольку он повреждает кучу, насколько это видно из ваших данных.
 Diego Sevilla20 сент. 2010 г., 21:59
Пожалуйста, будьте более конкретны. «Удаление кучки массивов кучи» не достаточно информации, чтобы знать, что происходит ...
 Steve Townsend20 сент. 2010 г., 22:02
Общий совет, согласно GMan - не используйте new / delete, используйте RAII:en.wikipedia.org/wiki/...

Ответы на вопрос(3)

Утверждения - это операторы, которые оцениваются только тогда, когда вы работаете в режиме отладки (дешевая проверка отладки).

Например, это приведет к ошибочному утверждению при отладке, но не приведет к ошибке при выпуске:

ASSERT(1 == 2);

Вполне вероятно, что какой-то метод, который вы вызываете, ожидает определенный ввод и не получает его, но он не вызывает немедленной ошибки (поэтому ваш код работает в режиме без отладки.)

Надеюсь, это полезно.

Если вы можете опубликовать свой конкретный код, возможно, кто-то может помочь вам с более конкретным ответом.

Решение Вопроса

Ваш код портит кучу. Первый фрагмент взят из библиотеки времени выполнения C, assert сообщает вам, что ваша программа передает неверное значение указателя оператору delete.

Комментирование операторов delete просто скрывает проблему. Он вернется, чтобы преследовать вас по-другому, когда вы продолжите разработку программы. Есть несколько советов по отладке вэта тема, Изучение того, как отлавливать такие ошибки, является обрядом для любого программиста на C или C ++. Добро пожаловать в группу.

 Hans Passant20 сент. 2010 г., 22:51
Это было быстро. Поздравляю.
 Faken20 сент. 2010 г., 22:37
Благодаря вашему совету я нашел проблему. Я связал два указателя с одним и тем же массивом и попытался удалить данные, на которые указывали два указателя, что было хорошо при первом удалении, но во второй раз вызвало ошибку.
 Faken20 сент. 2010 г., 22:26
Спасибо за простое объяснение! Я посмотрю эту ветку и посмотрю, смогу ли я найти какие-либо идеи о том, что происходит.

Утверждения происходят, когда программа попадает в нелегальное состояние. Утверждение написано в коде программистом, чтобы уведомить его, когда что-то пойдет не так. Вы должны начать отладку из вашей IDE и нажать break, когда получите сообщение об утверждении. Чем вы должны увидеть, каково состояние в assert, какassert(i > 1024) и убедитесь, что это никогда не станет правдой. Может быть, у вас есть некоторые комментарии о значении assert, вы должны найти строку, где это происходит и почему.

Ваш ответ на вопрос