Ошибка отладки - PullRequest
       23

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

3 голосов
/ 20 сентября 2010

Я продолжаю сталкиваться с этой ошибкой "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;

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

Ответы [ 3 ]

7 голосов
/ 21 сентября 2010

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

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

2 голосов
/ 21 сентября 2010

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

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

ASSERT(1 == 2);

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

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

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

1 голос
/ 21 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...