c++ - 如何在 C++ 中选择堆分配与堆栈分配?

标签 c++ memory-management scope c++11 software-design

将 C++ 与其他语言区分开来的一个特性是能够将复杂对象分配为成员变量或局部变量,而不必总是使用 new 来分配它们。但这会导致在任何给定情况下选择哪个的问题。

是否有一些好的标准来选择如何分配变量?我什么时候应该将成员变量声明为直接变量而不是引用或指针?我什么时候应该使用 new 分配变量,而不是使用在堆栈上分配的局部变量?

最佳答案

One of the C++ features that sets it apart from other languages

... 是您必须手动进行内存分配。但是让我们把它放在一边:

  • 当一个对象必须是长期存在的,即必须超过某个范围,并且成本高昂或无法复制或移动时,在堆上分配,
  • 当对象很大时在堆上分配(如果您想安全起见,较大可能意味着几千字节)以防止堆栈溢出,即使该对象只是暂时需要,
  • 如果您使用 pimpl (compiler firewall) idiom,则在堆上分配,
  • 在堆上分配可变大小的数组,
  • 否则在堆栈上分配,因为这样更方便。

请注意,在第二条规则中,“大对象”是指类似

char buffer[1024 * 1024];  // 1MB buffer

但不是

std::vector<char> buffer(1024 * 1024);

因为第二个实际上是一个非常的对象,其中包含一个指向堆分配缓冲区的指针。

关于指针与值成员:

  • 如果需要堆分配,请使用指针,
  • 如果要共享结构,请使用指针,
  • 对多态性使用指针或引用,
  • 如果您从客户端代码中获取对象并且客户端 promise 使其保持事件状态,请使用引用,
  • 在大多数其他情况下使用值。

当然建议在适当的情况下使用智能指针。请注意,您可以在堆分配的情况下使用引用,因为您始终可以delete &ref,但我不建议这样做。引用是伪装的指针,只有一个区别(引用不能为空),但它们也表示不同的意图。

关于c++ - 如何在 C++ 中选择堆分配与堆栈分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973138/

相关文章:

c++ - 我忘了这个叫什么了?

c++ - 评估这个的顺序是什么?为什么? C++

c++ - 在 Windows 10 上合成语音 : Scenario_SynthesizeText. xaml.h 丢失

c++ - powerOf(int x, int n) 的最佳方式?

web-services - 我应该从 Web 服务调用中释放自动实例化的 Delphi 对象吗?

c++ - 如何在 C++ 中访问父作用域的变量?

c# - 为什么我不能在 C# 中的不同作用域中声明同名变量?

c++ - 如何在windows中使用openssl的静态库?

c++ - 如何有效使用Boost的intrusive_ptr?

linux - 如果下一个请求适合 mmap 是否使用已分配的 block ?