На операторе delete вылетает ошибка непосредственно во время выполнения программы, когда ты вылезаешь за пределы выделенной области в памяти.
Если я первый кусок закоментирую, тоесть сделаю так
code
Код: Выделить всё
int main()
{
/* FILE *f=fopen("/home/siarhei/tmp/1.fb2","r");
fseek(f,0,SEEK_END);
int len=ftell(f);
fseek(f,0,SEEK_SET);
char *c=new char[len];
fread(c,len,1,f);
fclose(f);
delete[] c;*/
FILE *f2=fopen("/home/siarhei/tmp/2.fb2","r");
fseek(f2,0,SEEK_END);
int len2=ftell(f2);
fseek(f2,0,SEEK_SET);
char *c2=new char[len2];
fread(c2,len2,1,f2);
fclose(f2);
delete[] c2;
int yyyy; cin>>yyyy;
return 0;
}
То файл 2.fb2 прекрасно загружается в память и удаляется из неё, если первый кусок кода не комментировать то тоже нормально загружается и программа завершается без ошибки, но обём замимаемой памяти больше чем надо, в памяти файл 2.fb2 остаётся(тоесть напишу я или не напишу delete[] c2;, ничего не меняется, когда нужно ввести yyyy то памяти занято 852кб, а хотя должно быть 172кб, а если сбросить core, то там можно найти не удалённый 2.fb2).
Загружаю я его не в текстовом режиме, а просто записываю в память байты из файла, а потом определяю кодировку и уже перегоняю в utf8 и делаю что мне надо(этот код просто пример непонятного мне явления).
Добавлено спустя 7 минут 10 секунд:
Ты же возвращаешь указатель? Значит можно создать в куче новую строку и копипастнуть туда старую, постепенно заменяя нужные символы или расставляя слэши. Память выделять сначала равную старой строке, потом перевыделять, если нужно ещё.
Я так и делаю, только выделяю сразу память strlen(s)*2 поскольку если вставлять туда слеши то она будет длиней, потом перевыделяю на более короткую. Функция работает. Просто заметил что некоторые функции, например strlwr старую строку не сохраняют, поэтому может есть какое-то правило по поводу это, вот и спросил.
Вообще с этим ясно, спасибо
Добавлено спустя 3 минуты 18 секунд:
Ах да, чуть ли не самое важное... Не мешай C и C++. Хуже просто не придумать.
В смысле? Использовать iostream? Я как то не привык. У меня вообще есть универсальная функция int LoadFile(const char *fn,char *&file), я почти всегда гружу весь файл в память, а потом делаю с ним что надо. (Ежели встречу большой файл, то естественно так делать не буду)