堆栈分配失败,堆分配成功!可能吗?

时间:2010-04-22 11:38:24

标签: c++ visual-c++ stack

我有以下片段

Class Sample
{ Obj_Class1 o1;
  Obj_Class2 o2;};

但是Obj_Class1Obj_Class2的大小非常大,因此编译器会显示警告“考虑将一些空间移动到堆中”。我被要求用Obj_Class1* o1 = new Obj_Class1();替换Obj_Class1 o1但是我觉得没有使用这个更改,因为如果堆栈分配失败,堆分配也会失败。我对么?或者进行此更改是有意义的(除了抑制编译器警告之外)。

4 个答案:

答案 0 :(得分:5)

堆栈通常比堆小。它们使用不同的内存位置。堆栈的大小通常约为兆字节(您可以更改它,但要小心)并按每个线程分配。如果需要,堆可以消耗千兆字节。

答案 1 :(得分:3)

堆栈通常很小,不适合容纳大型对象,而堆是独立的并为它们设计。

在您的示例中,您应该在堆上分配整个Sample,而不是其成员:

int main() {
   Sample* sample = new Sample();
}

答案 2 :(得分:3)

默认情况下,堆栈相当小:http://msdn.microsoft.com/en-us/library/ms686774(VS.85).aspx

  

保留和初始提交的堆栈内存的默认大小在可执行文件头中指定。如果没有足够的内存来保留或提交所请求的字节数,则线程或光纤创建将失败。链接器使用的默认堆栈保留大小为1 MB。要为所有线程和光纤指定不同的默认堆栈预留大小,请使用模块定义(.def)文件中的STACKSIZE语句。操作系统将指定大小四舍五入到系统分配粒度的最接近倍数(通常为64 KB)。要检索当前系统的分配粒度,请使用GetSystemInfo函数。

答案 3 :(得分:2)

对于visual studio,默认情况下每个线程获得1 MB空间,如果尝试分配更多,则会出现堆栈溢出错误。堆没有此限制,您可以分配的内存量取决于进程虚拟内存中可用的最大连续空间。因此,如果对象非常庞大,堆栈分配就会失败,这并不奇怪。