我应该在什么时候分配堆? (C ++)
我不明白什么时候应该在堆上分配内存以及何时应该在堆栈上分配内存。 我真正知道的是,在堆栈上分配速度更快,但由于堆栈较小,我不应该使用它来分配大型数据结构; 在决定分配内存的位置时应考虑哪些其他事项? 编辑:我应该在哪里分配实例变量?
当内存必须超出当前函数的范围时才使用堆。
只有在编译时知道需要的存储空间有多大时,才能将堆栈用作存储空间。 接下来你可以使用堆栈
int
或double
或MyClass temp1;
变量 char local_buf[100];
或MyDecimal numbers[10];
当你只知道你在运行时需要多少空间时,你必须使用堆(“free store”),你应该使用这个堆来存放大的静态已知的缓冲区(比如不要做char large_buf[32*1024*1024];
)
然而,通常情况下,你很少直接触摸堆,但通常使用为你管理一些堆内存的对象(并且对象可能位于堆栈上或作为另一个对象的成员 - 然后你不关心另一个对象的位置生活)
给一些示例代码:
{
char locBuf[100]; // 100 character buffer on the stack
std::string s; // the object s will live on the stack
myReadLine(locBuf, 100); // copies 100 input bytes to the buffer on the stack
s = myReadLine2();
// at this point, s, the object, is living on the stack - however
// inside s there is a pointer to some heap allocated storage where it
// saved the return data from myReadLine2().
}
// <- here locBuf and s go out-of-scope, which automatically "frees" all
// memory they used. In the case of locBuf it is a noop and in the case of
// s the dtor of s will be called which in turn will release (via delete)
// the internal buffer s used.
因此,为了给一个简短的回答你的问题时 :不要在堆上分配(通过任何new
,除非这是通过适当的包装对象完成)。 (std :: string,std :: vector等)