【发布时间】:2019-07-15 14:47:33
【问题描述】:
假设我在一种方法中有很多堆栈分配。
如果我在一组代码中添加花括号,分配的对象会在超出范围时从堆栈中弹出,还是需要在释放内存之前退出方法?
我还应该补充一点,这是在 MFC 应用程序中完成的。
void LongMethod()
{
{
struct someLargeStruct;
// Do a lot of work and allocations.
}
{
struct anotherLargeStruct;
// more work here.
}
}
【问题讨论】:
-
没有通用的方法来回答这个问题(谁说目标平台甚至有堆栈?)。查看编译器生成的代码。
-
它是实现定义的,因为 C++ 标准(和 C 标准)不知道调用堆栈。
-
虽然堆栈是一种有限的资源,但如果您担心超出该限制,那么解决问题的方法可能不是更多的嵌套或更多的函数。也许问题在更高的层次上(设计、分析甚至需求),而解决方案必须在那个层次上?
-
作用域(花括号)确保在作用域结束时调用对象析构函数。是否也释放内存是实现定义的,您通常不需要关心。
-
我对数据包做了很多位移。设计完全取决于我,但用一种或两种方法完成所有事情是有意义的。我想我可以使用堆。到目前为止一切正常。