2

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

4

3 回答 3

9

如果buffer是局部变量,那么您尝试在堆栈上分配数组。堆栈通常在低兆字节范围内(如一到四)。您尝试分配超过4 兆字节,但这是行不通的。

解决这个问题的简单方法是在堆外动态分配它:

char* buffer = new char[size + 1];

// Do operations on `buffer`

delete[] buffer;
于 2013-07-26T10:54:41.380 回答
0

这发生在您身上,因为静态数据存储在堆栈中,其大小为几 MB。如果您动态分配内存,您的数据将进入堆并且它更大。

在你的情况下,我会使用容器。大概vector

std::vector<char> buffer(size);

容器比指针更安全,比动态分配更安全,因为如果您不再使用容器,容器会自动删除内容。此外,您始终可以安全地增加容器的大小,只需推动另一个值。

如果您需要将它传递给函数,您可以传递引用(这可能是最好的选择),但是您可以通过这样做将指针传递给第一个元素:(&buffer[0] 这只适用于vector

更重要的是,您可以通过获取指向数据的指针来遍历所有容器。

for (std::vector::iterator it = buffer.begin(); it != buffer.end(); ++it)
{/*some stuff*/}

任何类型的容器的迭代看起来都一样。

更重要的是,你分配了 4348928 个字符,大约是 4MB。但是,如果您需要分配让我们说 300MB 分配new通常会失败(与 相同vector)。对于如此大的分配,您应该使用std::deque.

于 2013-07-28T13:42:26.560 回答
-1

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

于 2013-07-26T10:58:42.633 回答