c ++堆栈溢出大数组的未处理异常

时间:2012-05-03 02:06:44

标签: c++ arrays stack-overflow

是的,在查看了这个问题之后,我认为这是因为我在我的班级定义中wchar_t downloadedText[400000];我已经阅读了有关如何使用new运算符处理此问题的解决方案分配空间,即: wchar_t *downloadedText; downloadedText = new wchar_t[400000];

但是我需要将类的实例写入文件,并且像上面那样分配变量似乎使用指针指向以不会写入我的文件的方式存储的数据。这也是我无法使用std::vector的原因。

我已经读过我可能有的另一个选择是我可以增加'堆栈'的大小。我使用VS2010作为我的IDE,并且我找到了我的项目属性>链接器>系统'堆栈提交大小','堆栈保留大小','堆提交大小'和'堆保留大小'字段,但我不确定这是否是我如何处理我的问题,如果是,正确设置什么适当的字段。

4 个答案:

答案 0 :(得分:3)

如果你必须这样做......你可以在写出对象后明确地编写数组。例如

write((char*)&myObjects[i]), sizeof(MyClass));
write((char*)downloadedText, sizeof(downloadedText[0]) * 400000);

再读回来:

read((char*)&myObjects[i]), sizeof(MyClass));
downloadedText = new wchar_t[400000];
read((char*)downloadedText, sizeof(downloadedText[0]) * 400000);

然而,这非常脆弱且容易出错。如果你正在使用为此目的明确创建的结构(通常只包含POD),那么在读取操作中覆盖内存中的对象最好是不好的形式。至少,请注意您必须在读取后写入已下载的文本成员字段。

答案 1 :(得分:2)

您可以在系统堆中使用new运算符分配整个对象,但不能在堆栈上分配。在这种情况下,您可以以相同的方式将此对象写入文件,并且没有堆栈溢出的麻烦。

答案 2 :(得分:1)

是的,您可以使用链接器选项/STACK在Visual Studio中增加堆栈大小。此链接器选项也可使用项目属性堆栈保留大小堆栈提交大小进行编辑。设置保留大小就足够了,提交大小是可选的。不过,您也应该能够使用std::vector

答案 3 :(得分:0)

听起来你对当前的序列化策略很好(使对象POD,并将其写为POD值)。在这种情况下,你的问题实际上是“如何防止这些对象在堆栈上占用太多空间?”答案是:不要将它们放在堆栈上。

用新的分配它们。或者,最好将它们包装在某种智能指针中。


你有类似字符串的数据。碰巧C ++提供了一个字符串类。事实上,由于您正在谈论wchar_t个字符,因此您需要查看std::wstring(在<string>标题中)。