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

Ваш аккаунт

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

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

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

непонятная течка памяти

1.9K
15 ноября 2007 года
0xf001
96 / / 24.05.2005
вот моя проблема.
в программе, которую я пишу с недавнего времени начали возникать глюки распределения памяти. Причем вроде оперативу не жрет, 28 метров максимум(в диспетчере задач), вроде огромных массивов данных не оставляю бесхозными, везде чищу операторами delete/delete[].
Но при попытке выделить новый блок памяти (например new char[2000], размер в сущности не важен) прога в напирается на экзепшн и выкидывает в среду разработки (VS) для отладки. Либо при попытке удалить массив (delete[]) данных ведет себя похожим образом.
Не знаю как эта флюктуация правильно назвается, "утечка" ли это "памяти", но в коде все правильно, я пошагово специально проверял. Указательи везде валидные, даные (в данном куске проги - массивы текстов char*) нормальные, на своих местах. Почему запарывает - понять не могу.

И ведь еще открывает зачем-то файл <new.h> и показывает стрелочкой мол "тут ошибко"... Что это может быть? Всю прогу я скинуть не могу, ибо большая, что никто не станет копаться. Может это уже широкоизвестные глюки, и для борьбы с ними уже выработаны приемы? Еще я слышал есть какие-то специальные проги для обнаружении утечек...

(язык с++, среда разрабодки VisualStudio8)
13K
15 ноября 2007 года
specter
113 / / 28.09.2007
Эксепшн всегда происходит в одном месте или в разных? Происходит постоянно?
1.9K
15 ноября 2007 года
0xf001
96 / / 24.05.2005
экзепшн происходит всегда в одном месте, до тех пор, пока я не удалю/добавлю операторы контроля памяти (new/delete). Причем ошибко возникает только при вызове этих операторов.
Например если я уберу delete[] для массива char -ов то ошибко возникнет при вызове new для другого массива char -ов или вообще другого класса.
5.9K
15 ноября 2007 года
Zushenskiy
161 / / 29.06.2006
код в студию. скорее всего вылазишь за педелы выделенной памяти или неправильно выдиляешь. частая ошибка
1.9K
15 ноября 2007 года
0xf001
96 / / 24.05.2005
ну например основные глюки начались при использовании этой функции. она проворачивает текст, возвращает его расшифрованую версию, а старую удаляет.
Код:
char * decrypt_text(char * dec_text)
{
       
    //-------------------------------------------------------------------------------
    // инициируем ключ
        gost_ctx gc_decrypt;
        u4 k_decrypt[8];
        gost_init(&gc_decrypt);
        for(int i=0;i<8;i++) k_decrypt = i;
        gost_key(&gc_decrypt,k_decrypt);

    //-------------------------------------------------------------------------------
    // считываем зашифрованное и считаем всякие длинны
        unsigned declen=strlen(dec_text);
        unsigned datadeclen=declen/8;
        unsigned textlen=datadeclen*4;
        u4 *DATA_DEC=new u4[datadeclen];

        memset(DATA_DEC, 0, datadeclen);

    //-------------------------------------------------------------------------------
    //перекатываем из текстового формата в переменную

        unsigned textflag=0, blockflag=0;
        char block[9]; block[8]=0;
        while(textflag<declen)
        {
            block[blockflag]=dec_text[textflag];
            blockflag++; textflag++;
            if(blockflag==8)
            {
                blockflag=0;
                sscanf(block, "%08lx", &DATA_DEC[textflag/8-1]);
            }
        }

    //-------------------------------------------------------------------------------

        gost_dec(&gc_decrypt, DATA_DEC, datadeclen); // собсна расшифровка

    //-------------------------------------------------------------------------------
    // выносим данные в строку

        gost_destroy(&gc_decrypt);

        //совмещаем адресное пространство
        char *dtext=(char*)DATA_DEC;
        for(unsigned i=strlen(dtext); i<textlen; i++) dtext=0;

        delete[] dec_text;
        //(char*)DATA_DEC
    return dtext;
}
1.9K
16 ноября 2007 года
0xf001
96 / / 24.05.2005
Цитата:

или неправильно выдиляешь


Как не правильно можно выделить память? Разве оператора new недостаточно для правильного выделения?

3
16 ноября 2007 года
Green
4.8K / / 20.01.2000
м-да... код нечитабельный настолько, что даже ты сам, видимо, его не можешь прочесть.
Смотри интересные места:
 
Код:
char * decrypt_text(char * dec_text)
{
    u4 *DATA_DEC=new u4[datadeclen];

    char *dtext=(char*)DATA_DEC;

    delete[] dec_text;

    return dtext;
}

1. Ты не освобождаешь память, выделенную под DATA_DEC, но возвращаешь из функции указатель на нее. Так и должно быть? Если да, то это некрасиво.
2. Ты освобождаешь память указатель на которую тебе пришел в функцию в качестве аргумента dtext. ак и должно быть? Если да, то это некрасиво.

Ну и как всегда совет: если пишешь на C++, используй C++.
Твой код - это скорее C, чем С++. Почему бы не использовать возможности C++ ?
1.9K
16 ноября 2007 года
0xf001
96 / / 24.05.2005
Цитата:

1. Ты не освобождаешь память, выделенную под DATA_DEC, но возвращаешь из функции указатель на нее. Так и должно быть? Если да, то это некрасиво.
2. Ты освобождаешь память указатель на которую тебе пришел в функцию в качестве аргумента dtext. ак и должно быть? Если да, то это некрасиво.


Все правильно. старая строка dec_text удаляется, и возвращается указатель на новую строку. Просто там стоит такое: buff=decrypt_text(buff);
Согласен, некрасиво. Но это временно, я сечас удаление старого текста вынес из этой ф-и.
Теперь на счет char *dtext=(char*)DATA_DEC;
Видите ли, DATA_DEC - это массив зашифрованных данных, которые обрабатываются только в виде long 'ов. Т.е. при работе алгоритма ГОСТ данные обрабатываются блоками по 4 байта. А сама последовательность единиц и нулей в них может являться чем угодно. Например текстом.

Теперь о главном. ошибку я нашел. и она оказалась как всегда тупой, только зря нафлУдил.
Алгоритм обрабатывает блоки парами. Т.е. если у меня есть массив из 10 блоков, то в функцию расшифровки я должен передать параметр 5 - количество ПАР блоков.

gost_dec(&gc_decrypt, DATA_DEC, datadeclen/2);

обратите внимание на двоечку....
Всем спасибо. тема закрыта.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог