Кажется, я получаю тот же результат с этими двумя фрагментами. Я просто немного смущен, как они оба могут работать, и я надеюсь на некоторые идеи, почему это так.
delete[]
? std::ifstream file
char buffer[bufferSize];
file->read(buffer, bufferSize);
В.С.
char * buffer = new char[bufferSize];
file->read(buffer, bufferSize);
Первое объявление 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 в некоторой форме.
Чтобы ответить на вопросы, которые вы отправили после того, как я в основном набрал ответ выше:
unique_ptr
вместоvector
?