我正在进行可视化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时,它甚至不起作用 - 当然没有错误)
答案 0 :(得分:9)
如果buffer
是局部变量,那么您尝试在堆栈上分配数组。堆栈通常处于低兆字节范围内(如1到4)。您尝试分配 over 四兆字节,这将无法正常工作。
解决这个问题的简单方法是从堆中动态分配它:
char* buffer = new char[size + 1];
// Do operations on `buffer`
delete[] buffer;
答案 1 :(得分:0)
这种情况发生在您身上,因为静态数据存储在堆栈中,其大小为几MB。如果您动态分配内存,那么您的数据会进入堆中,并且会更大。
在你的情况下,我会使用容器。可能是vector
。
std::vector<char> buffer(size);
容器比指针更安全,然后比动态分配更安全,因为如果你不再使用它,容器会自动删除东西。此外,您可以随时安全地增加容器的大小,只需按下另一个值。
如果你需要将它传递给函数你可以传递引用(它可能是最好的选项),但是你可以通过执行以下操作将指针传递给第一个元素:&buffer[0]
(这仅适用于{ {1}})强>
您还可以通过获取指向数据的指针来遍历所有容器。
vector
对于任何类型的容器,迭代看起来都是一样的。
更重要的是,你分配了4348928个字符,大约是4MB。但是如果你需要分配,那么用for (std::vector::iterator it = buffer.begin(); it != buffer.end(); ++it)
{/*some stuff*/}
分配的300MB通常会失败(与new
相同)。对于如此大的分配,您应该使用vector
。
答案 2 :(得分:-1)
使用指针,因为本地函数内存是从堆栈中分配的,它将无法获取那么多的内容。