我应该啥时候在堆上分配? (C++)
Posted
技术标签:
【中文标题】我应该啥时候在堆上分配? (C++)【英文标题】:When should I allocate on the heap? (C++)我应该什么时候在堆上分配? (C++) 【发布时间】:2011-03-10 20:56:02 【问题描述】:我真的不明白什么时候应该在堆上分配内存,什么时候应该在堆栈上分配。我真正知道的是在堆栈上分配更快,但由于堆栈较小,我不应该用它来分配大型数据结构;在决定在哪里分配内存时,我还应该考虑哪些其他事项?编辑:我应该在哪里分配实例变量?
【问题讨论】:
重复***.com/questions/599308/… 【参考方案1】:-
在堆栈上为大多数对象分配。生命周期 == 范围。
如果您需要手动控制对象的生命周期,请将其分配在堆上。
如果对象很大并且堆栈不够大,请将其分配到堆上。
在情况 2 和 3 中使用(坏名)RAII 惯用语,它允许您使用堆栈上的对象来操作可能是堆上的对象的资源 - 一个很好的例子是像 std:: 这样的智能指针shared_ptr/boost::shared_ptr。
【讨论】:
我想补充一点。 5. 如果你喜欢 C++0x,你也可以看看 unique_ptr。我个人认为运动语义非常干净。这不会像 shared_ptr 那样经常有用,但是 unique_ptr 有一些非常有用的语义可以保持它的效率。【参考方案2】:当内存必须持续超出当前函数的范围时使用堆。
【讨论】:
【参考方案3】:根据我的经验,当您想在运行时声明对象数组的大小时,堆分配最有用。
int numberOfInts;
cout << "How many integers would you like to store?: ";
cin >> numberOfInts;
int *heapArray = new int[numberOfInts];
此代码将为您提供一个大小为 numberOfInts 的指向整数数组。也可以在堆栈中执行此操作,但它被认为是不安全的,并且您可能会收到此站点命名的错误。
【讨论】:
【参考方案4】:只有在在编译时知道你需要多大的存储空间时,你才能将堆栈用作存储空间。因此,您可以将堆栈用于
单个对象(就像您声明一个本地int
或 double
或 MyClass temp1;
变量一样
静态大小的数组(就像你声明 char local_buf[100];
或 MyDecimal numbers[10];
时所做的那样
您必须使用堆(“免费存储”),当您只知道在运行时需要多少空间并且您应该可能将堆用于静态大容量已知缓冲区(如 不 做 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 等)
【讨论】:
以上是关于我应该啥时候在堆上分配? (C++)的主要内容,如果未能解决你的问题,请参考以下文章