大型内存大小分配给int类型的缓冲区

时间:2013-07-26 10:51:00

标签: c++ types buffer buffer-overflow

我正在进行可视化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时,它甚至不起作用 - 当然没有错误)

3 个答案:

答案 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)

使用指针,因为本地函数内存是从堆栈中分配的,它将无法获取那么多的内容。