是否有可能在本地范围内证明堆分配变量的合理性



我遇到了以下代码片段。

int main() {
auto a = new A(/* arguments */);
// Do something
delete a;
}

这里A是一个非常不平凡的类,我无法轻易地推理(高度并行化和网络化(。因为xmain(或任何其他函数(中被实例化,然后在作用域结束时被删除,所以我认为没有理由堆分配这个变量a。相反,我会简单地将它实例化为一个堆栈变量A a(/* */)

然而,我想知道是否有任何合理的理由动态分配A。我想到的一件事是,如果A是一个巨大的物体,那么可以在堆栈中节省一些空间,而我怀疑这在现代机器中是否真的有意义。

首先,没有理由不在这里使用智能指针,即

auto a = std::make_unique<A>(/* arguments */);

但是,至于为什么要堆分配而不是在堆栈上创建对象,原因包括

  1. 尺寸。A级可能很高。堆叠空间并非取之不尽;堆空间要大得多。说真的,即使在现代机器上,你也可以很容易地溢出堆栈。您不希望堆叠分配100000个项目的数组,等等
  2. 您可能需要一个用于运行时多态性的指针。假设不是直接调用A的构造函数,而是调用一些工厂函数,该函数向A继承的基类返回unique_ptr,而代码的其余部分则依赖于对a的多态调用;在这种情况下,您需要使用动态分配

最新更新