singlepost

Не получается удалить массив из динамической памяти << На главную или назад  

У меня проблема:( пишу на С++ в MSVC 2008 )

//определяю размер файла f1
fseek( f1, 0, SEEK_END );
size1 = ftell( f1 );
fseek( f1, 0, SEEK_SET );

//создаю массив
char * arr_from_file_1 = new char[size1];

//загружаю содержимое файла в массив
fread( arr_from_file_1, size1, 1, f1 );

//обработка……….

//удаляю массив
delete [] arr_from_file_1;

Код компилируется і работает до удаления массива. Потом – сообщения об ошибке!
Может я чтото не верно делаю?
Ище, есть какая-то функция для определения размера файла?

48 ответов в теме “Не получается удалить массив из динамической памяти”

  1. 20
    Володя Квич ответил:

    мемset(arr_from_file_1,'\0',sizeof(char[size1])); — даже не знали, что функцыя есть.
    Пересматрел код программы и обнаружил, что строки
    arr_from_file_1[size1] = '\0';
    вопше и не надо. :) Както механически написал, и ошыбка через єто.
    Да, учитса надо ищё…

  2. 19
    Роман Воробец ответил:

    При наличии некоторой дисциплины обнулять совершенно не обязательно. Для новичков – может быть, и нормально.

  3. 18
    Алексей Некрашенко ответил:

    Обычно хорошим тоном считается обнулить выделенный массив – мемset(arr_from_file_1,'\0',sizeof(char[size1]));
    В принципе тоже самое, что добавление '\0' в конце, хотя и медленнее работает. Используется чаще, если читаем поток неизвестного размера, при этом естественно size1 должно быть как минимум на 1 больше прочитанных данных, если мы читаем строки. Но если чтение идет в бинарном коде, то сколько выделил, столько и прочитал – с таким массивом нельзя работать, как с обычной char строкой. В общем все зависит от целей программы при интерпретации содержимого файла.

  4. 17
    Роман Воробец ответил:

    Никто ничего не добавляет. Сколько скажешь, столько и будет прочитано.

  5. 16
    Володя Квич ответил:

    >fread() же на конце '\0' возвращает?

    Может я не очени хорошо знаю С++, но fread() используют для по-блокового чтения в бинарном режиме открытия файла, и у меня если '\0' на поставить, то виводит ищё какой-то бред в конце…

  6. 15
    Роман Воробец ответил:

    Чтобы было портабельно – нет, нельзя.

  7. 14
    Ванько Родригез ответил:

    fread() же на конце '\0' возвращает? Ну тогда да, size1 + 1.

  8. 13
    Володя Квич ответил:

    ! Работает !
    Спасибо.
    А размер файла можна коким-то другим способ определить?

  9. 12
    Роман Воробец ответил:

    Покажи строчку, где файл открывается.

  10. 11
    Володя Квич ответил:

    Ошибка исчезает если убрать чтение с файла

    fread( arr_from_file_1, size1, 1, f1 );
    arr_from_file_1[size1] = '\0';// <- из за етого ошибка

  11. 10
    Володя Квич ответил:

    кажетса, надо arr_from_file_1[size1-1] = '\0'.

  12. 9
    Роман Воробец ответил:

    в исходнике этого не было)
    надо new char[size1 + 1]

  13. 8
    Володя Квич ответил:

    Роман 'Gem' Воробец, там код програмы, не буду усьо писать здесь.

    //а может и надо….

  14. 7
    Роман Воробец ответил:

    Я имею в виду, временно закомментировать в программе. Очень простой метод поиска ошибки.

  15. 6
    Володя Квич ответил:

    Идея! Но ошибка не исчезла…

  16. 5
    Володя Квич ответил:

    Там обработка массива, точнее сравнение с другим массивом

  17. 4
    Олег Андреев ответил:

    Сообщение об ошибке выглядит как "сообщение об ошибке" или там что-то более конкретное? Типа "segmentation fault".

  18. 3
    Роман Воробец ответил:

    Попробуй закомментировать "точечки"…

  19. 2
    Володя Квич ответил:

    Debug error!

    Heap corruption detected: after Normal block (#54) at 0×014e0040
    CRT detected thet the application wrote to memory after end of heap buffer.

  20. 1
    Роман Воробец ответил:

    С ходу – всё правильно.
    А что вместо точечек-то?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.