Я делаю визуальное приложение C ++ и пытаюсь выделить размер для буфера (этот буфер в дальнейшем используется для хранения содержимого потока).
Нет проблем, если объявленный размер буфера меньше
const int size= 319000; //here there is no problem
но для доступа к некоторым моим данным из потока мне нужно объявить буфер такого размера
const int size=4348928;//this size cause the problem
char buffer[size+1];
HRESULT hr = pStream->Read(buffer, size, &cbRead );
Хотя последние две строки кода не играют никакой роли в моей проблеме, я просто хочу дать вам представление о том, что именно я делаю с размером этого буфера.
Но когда я объявляю этот размер, он ничего не делает (я имею в виду, что моя функция визуального приложения выглядит следующим образом: если вы щелкаете файл, он генерирует поток, и я сохраняю этот поток в буфере, и если я объявляю размер порядка 319000, программы работают нормально и когда увеличивают размер до 4348928, он даже не работает — и, конечно, ошибки нет)
Если buffer
является локальной переменной, затем вы пытаетесь разместить массив в стеке. Стек обычно находится в диапазоне низкого мегабайта (например, от одного до четырех). Вы пытаетесь выделить над четыре мегабайта, которые не будут работать.
Самый простой способ решить эту проблему — динамически выделить ее из кучи:
char* buffer = new char[size + 1];
// Do operations on `buffer`
delete[] buffer;
Это происходит с вами, потому что статические данные хранятся в стеке, а их размер составляет несколько МБ. Если вы выделяете память динамически, ваши данные попадают в кучу, и она становится намного больше.
В вашем случае я бы использовал контейнеры. Наверное vector
,
std::vector<char> buffer(size);
Контейнеры безопаснее, чем указатели, и намного безопаснее, чем динамические выделения, потому что контейнеры автоматически удаляют вещи, если вы их больше не используете. Также вы всегда можете безопасно увеличить размер контейнера, просто нажав другое значение.
Если вам нужно передать его в функцию, вы можете передать ссылку (это, вероятно, лучший вариант), однако вы можете передать указатель на первый элемент, выполнив это: &buffer[0]
(это работает только с vector
).
Более того, вы можете перебирать все контейнеры, получая указатель на данные.
for (std::vector::iterator it = buffer.begin(); it != buffer.end(); ++it)
{/*some stuff*/}
Итерации выглядят одинаково с любым типом контейнера.
Более того, вы выделяете 4348928 символов, это около 4 МБ. Но если вам нужно выделить, скажем, выделение 300 МБ с new
обычно терпит неудачу (то же самое с vector
). Для такого большого распределения вы должны использовать std::deque
,
Используйте Pointer, так как локальная функция памяти выделяется из стека, и она не сможет получить такую большую выборку.