1

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

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

我读过我可能有的另一个选择是我可以增加“堆栈”的大小。我使用 VS2010 作为我的 IDE,我位于我的项目属性 > 链接器 > 系统“堆栈提交大小”、“堆栈保留大小”、“堆提交大小”和“堆保留大小”字段中,但我不确定这是否是我如何处理我的问题,如果是,正确设置适当字段的内容。

4

4 回答 4

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。作为最低要求,请注意您必须在读取写入后设置下载的文本成员字段。

于 2012-05-03T06:02:17.603 回答
2

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

于 2012-05-03T05:40:39.723 回答
1

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

于 2012-05-03T06:34:02.707 回答
0

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

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


你有类似字符串的数据。碰巧 C++ 提供了一个字符串类。事实上,既然你在谈论wchar_t字符,你想看看std::wstring(在<string>标题中)。

于 2012-05-03T06:16:28.720 回答