Понимание распределения памяти в массиве символов

0

Кажется, я получаю тот же результат с этими двумя фрагментами. Я просто немного смущен, как они оба могут работать, и я надеюсь на некоторые идеи, почему это так.

  1. Оба массива хранятся одинаково в памяти?
  2. Они хранятся в рекламе?
  3. Нужно ли использовать delete[]?

std::ifstream file

char buffer[bufferSize];
file->read(buffer, bufferSize);

В.С.

char * buffer = new char[bufferSize];
file->read(buffer, bufferSize);
Теги:

2 ответа

2
Лучший ответ

Первое объявление buffer создает в стеке buffer статического размера: для того, чтобы это объявление работало, bufferSize должен быть константой времени компиляции! Ну, некоторые компиляторы имеют расширение для реализации массивов переменной длины переменной C в C++ тоже, но это не переносимо (по крайней мере, еще нет: есть и обсуждение создания аналогичной функции в C++).

Второе определение buffer выделяет массив в куче, используя выделение памяти. Если вы не delete[] буфер, у вас действительно есть утечка памяти, т.е. Вы, вероятно, захотите использовать что-то вроде

std::unique_ptr<char[]> buffer(new char[bufferSize]);
file->read(buffer.get(), bufferSize);

Оба исходных фрагмента кода работают, потому что массивы распадаются на указатели на их первый элемент при первой возможности, которую они получают. Это поведение наследуется от C.

Основное различие между обоими подходами заключается в том, что распределение стека выполняется быстро, но размер стека имеет тенденцию быть довольно ограниченным (например, по умолчанию только 48 кбайт в некоторых системах), в то время как выделение памяти в куче имеет тенденцию быть немного медленнее, но большие буферы обычно не являются проблема. Выделенная память в стеке освобождается при выходе из функции, в то время как память с выделенной памятью должна быть delete[] d в некоторой форме.

Чтобы ответить на вопросы, которые вы отправили после того, как я в основном набрал ответ выше:

  1. Нет: первый находится в стеке, второй - в куче.
  2. Нет: первый находится в стеке, второй - в куче.
  3. Зависит: нет, если объект находится в стеке, да, если объект находится в куче.
  • 0
    почему вы защищаете unique_ptr вместо vector ?
  • 0
    Так что у стека есть ограничение памяти, я этого не знал. Думал, что это связано только с тем, в каком объеме он существовал. 48 КБ - это далеко не то, что мне нужно. Двоичный файл, который я читаю, может быть в 100 раз больше этого. Я думаю, мне нужно хранить в куче тогда. Есть ли ошибка или исключение, которое выдается при заполнении стека?
Показать ещё 4 комментария
2
  1. nope, первый вариант использует стек, второй - кучу
  2. см. 1)
  3. только для второго варианта

Ещё вопросы

Сообщество Overcoder
Наверх
Меню