2013-11-21 2 views
2

Я смотрел на другой SO вопрос, и топ-рейтинг ответ сказал следующее:C++ выбрасывайте массив

Другие ответы уже упоминали RAII, и это хороший ответ. Тем не менее, советы best таковы: не выделяйте динамические объекты в первую очередь! Не пишите

Foo * x = new Foo();

, когда вы могли бы просто написать

Foo x;

вместо этого.

Это похоже на звуковой совет для меня. Основанный на стеке материал уже имеет прекрасное и хорошее автоматическое управление временем жизни.

Мой вопрос заключается в следующем: Как я применить этот звук советы что-то вроде

char * buffer = new char[1024]; 
stream.read(buffer, 1024); 
...do stuff... 
delete[] buffer; 

извинения, если я быть немым, но как создавать массивы без использования new[]?

+0

Может быть, char buffer [1024]? – JoeC

ответ

5
char buffer[1024]; 
stream.read(buffer, 1024 /* or sizeof(buffer) */); 
+0

Настолько проще ... Теперь я чувствую себя немой. – MathematicalOrchid

+2

Да, в любое время, когда размер буфера известен во время компиляции и не выходит за пределы его видимости, он является кандидатом на перемещение в стек. Однако одна из причин, по которой даже буферы с фиксированным размером и временем жизни могут быть лучше не в стеке, заключается в том, что они настолько велики, что они рискуют использовать все пространство стека. 1024 байта относительно невелики, но если размер буфера был, скажем, 10 MiB, тогда вы не захотите его в стеке. В этом случае вам все равно не следует использовать 'new', вы должны использовать что-то вроде' std :: vector buf (10485760); '. @MathematicsOrchid – bames53

+0

@ bames53 Насколько велика "большая"? Каков типичный размер стека C++? – MathematicalOrchid

4

Если массив фиксированного размера (например, 1024 в вашем вопросе), только это:

char buffer[1024]; 

Или, в C++ 11, предпочтительная:

std::array<char, 1024> buffer; 

Если размер приращения известен только во время выполнения (или если он слишком большой, чтобы удобно вставить в стопку), то:

std::vector<char> buffer(1024); 
+0

AFAIK, вы не можете использовать 'std :: vector' для функций ввода-вывода, таких как' read() '. – MathematicalOrchid

+0

@MathematicsOrchid Почему? Что не так с 'vectorBuffer.data()' (C++ 11) или '& vectorBuffer.front()' (pre-C++ 11)? – Angew

+0

Что серьезно работает? Я предположил, что 'std :: vector' не гарантирует, что элементы хранятся смежно в памяти ... – MathematicalOrchid

Смежные вопросы