2014-12-07 2 views
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

Первой декларация 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

howcome вы защищаете 'unique_ptr' вместо' vector'? –

+0

Итак, у стека есть ограничение памяти, этого не было. Думал, что это связано только с тем, в какой области он существовал. 48kb далек от того, что мне нужно. Бинарный файл, который я читаю, может быть в 100 раз больше. Наверное, мне нужно хранить в куче.Есть ли ошибка или исключение, которое возникает при переполнении стека? – superhero

+0

@MattMcNabb: Как 'std :: vector' выдает массив, выделенный в куче? :-) Более серьезно, если вам просто нужен локальный массив с динамическим размером, 'std :: unique_ptr ' на самом деле является разумным вариантом, хотя я лично, вероятно, просто использовал бы 'std :: vector ', если мне нужен массив. –

2
  1. Нету, первый вариант использует стек, второй - куча
  2. см 1)
  3. для второго варианта только
Смежные вопросы