непонятная течка памяти
в программе, которую я пишу с недавнего времени начали возникать глюки распределения памяти. Причем вроде оперативу не жрет, 28 метров максимум(в диспетчере задач), вроде огромных массивов данных не оставляю бесхозными, везде чищу операторами delete/delete[].
Но при попытке выделить новый блок памяти (например new char[2000], размер в сущности не важен) прога в напирается на экзепшн и выкидывает в среду разработки (VS) для отладки. Либо при попытке удалить массив (delete[]) данных ведет себя похожим образом.
Не знаю как эта флюктуация правильно назвается, "утечка" ли это "памяти", но в коде все правильно, я пошагово специально проверял. Указательи везде валидные, даные (в данном куске проги - массивы текстов char*) нормальные, на своих местах. Почему запарывает - понять не могу.
И ведь еще открывает зачем-то файл <new.h> и показывает стрелочкой мол "тут ошибко"... Что это может быть? Всю прогу я скинуть не могу, ибо большая, что никто не станет копаться. Может это уже широкоизвестные глюки, и для борьбы с ними уже выработаны приемы? Еще я слышал есть какие-то специальные проги для обнаружении утечек...
(язык с++, среда разрабодки VisualStudio8)
Например если я уберу delete[] для массива char -ов то ошибко возникнет при вызове new для другого массива char -ов или вообще другого класса.
{
//-------------------------------------------------------------------------------
// инициируем ключ
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;
}
или неправильно выдиляешь
Как не правильно можно выделить память? Разве оператора new недостаточно для правильного выделения?
Смотри интересные места:
{
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. Ты не освобождаешь память, выделенную под 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);
обратите внимание на двоечку....
Всем спасибо. тема закрыта.