Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема при запуске.Помогите, пож-та, разобраться.

35K
27 декабря 2008 года
Princesska
17 / / 27.12.2008
[SIZE="1"] я записываю данные в текстовый файл, всё записывается, но потом программа сообщает об ошибке, ищу где она может быть ,поиск ничего не дал, похожие темы есть, но все не то...

Сама ошибка происходит здесь:

Код:
[COLOR="Blue"]void operator delete[/COLOR](
        [COLOR="Blue"]void[/COLOR] *pUserData
        )
{
        _CrtMemBlockHeader * pHead;

        RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));

       [COLOR="Blue"] if[/COLOR] (pUserData == NULL)
            [COLOR="Blue"]return[/COLOR];

        _mlock(_HEAP_LOCK); [COLOR="DarkGreen"] /* block other threads */[/COLOR]
        __TRY

          [COLOR="DarkGreen"]  /* get a pointer to memory block header */[/COLOR]
            pHead = pHdr(pUserData);

             [COLOR="DarkGreen"]/* verify block type */[/COLOR]
--тут---> [COLOR="Red"]_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));[/COLOR]

            _free_dbg( pUserData, pHead->nBlockUse );

        __FINALLY
            _munlock(_HEAP_LOCK);  [COLOR="DarkGreen"]/* release other threads */[/COLOR]


        __END_TRY_FINALLY

       [COLOR="Blue"] return[/COLOR];
}
[/SIZE]
та часть программы где возникает ошибка работет с текстом в Edit Box'e, добавляет строчку о потраченном времени (счетчик секунд) к выводимой матрице чисел, которая уже хранится в pBuffer:


Код:
wsprintf(s,("вы закончили за %8d секунд"),iCounter);
             
           
       
               
lstrcat(pBuffer,s);

                [COLOR="DarkGreen"]/* определение размера строки */[/COLOR]
                txt_length=lstrlen(pBuffer);

                SetFilePointer(hDest,0,0,FILE_BEGIN);

           
                [COLOR="DarkGreen"]// запись в файл текста [/COLOR]
                WriteFile(hDest,pBuffer, txt_length+1, &written, NULL);
           
               
               
                [COLOR="DarkGreen"]/* закрытие файла */[/COLOR]
                CloseHandle(hDest);
               
    [COLOR="DarkGreen"]//заходит в void operator delete[/COLOR]    
                [COLOR="DarkGreen"]/* удаление динамически созданного элемента */[/COLOR]
                [COLOR="Red"]delete filename[/COLOR];
1
27 декабря 2008 года
kot_
7.3K / / 20.01.2000
Сформулируйте четко свой вопрос - что есть в вашем понимании "матрица чисел" например. Это вы сами чтото придумали или так называете например массив? если вы его так называете - то укажите пожалуйста сразу все термины которые вы будете придумывать по ходу.
С чего собственно вы полезли вызывать оперетор delete - при том что не видно - где выделяется память? Как вариант - это собственно и есть ошибка - вы пытаетесть очистить память которую не выделяли.
35K
28 декабря 2008 года
Princesska
17 / / 27.12.2008
Программка ниже (мой курсовик=)) Это простейшая карточная игра, в EditBoxe нужно выводить записанную в текстовый файл инфу об окрытых ранее играх (матрица открытых и закрытых карт и инфа о потраченном времени). Вся информация благополучнго записывается в файл, но потом программа кричит о невалидности указателя( в delete [] filename)
35K
28 декабря 2008 года
Princesska
17 / / 27.12.2008
Короче я поняла!!, каждому new должен конечно по правилам соответствовать свой delete, но если память вообще не высвобождать получается прикольно. Надо просто выделить память с большим запасом : filename=new char[10000] например)))
Каждый раз когда зависает буду еще больше памяти выделять
479
28 декабря 2008 года
Ухух
142 / / 05.05.2006
А попробуйте для начала вообще не использовать delete. Возможно, они расставлены в куске, который вы откуда то дернули, исходя из объявлений, которые программист сделал где-то выше. Потом пройдите по тексту и ставьте delete только там, где вы явно сами использовали new.

При этом не помешает посмотреть в диспетчере задач число дескрипторов (закладка "Быстродействие") до запуска программы и после выхода из программы. Если память отъедается и не возвращается - вы это увидете по увеличению их числа при запуске и неуменьшении после.
35K
28 декабря 2008 года
Princesska
17 / / 27.12.2008
Спасибо, не знала что с помощью диспетчера задач можно дескрипторы смотреть, а кол-во delete у меня всё-равно с кол-вом new не совпадает - при этом память освобождается
как ни странно...
1
28 декабря 2008 года
kot_
7.3K / / 20.01.2000
:)
память возможно освобождается за счет сборщика мусора. Ряд компиляторов такое допускает. Но вот попыток освобождать ту память, которые не выделяли - не прощает практически никто. от этого и ошибка
7
01 марта 2009 года
@pixo $oft
3.4K / / 20.09.2006
Насколько я помню,при завершении процесса Windows освобождает всю выделенную им память,ибо она этому процессу принадлежит,и не может после его смерти память остаться ничьей.То же и с дескрипторами–они автоматически закрываются
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог