C++ 将 RAII 与多态性和堆栈分配结合使用

标签 c++ polymorphism raii

<分区>

我一直在研究 RAII ( http://tomdalling.com/blog/software-design/resource-acquisition-is-initialisation-raii-explained/ ) 并且有很多问题!

  1. 在堆栈上初始化对象有一些强有力的论据。有没有在堆上分配内存的好方案?

  2. 这如何处理多态对象?例如,您有一个名为 Biome 的抽象基类,您需要一个生物群系容器。此容器需要存储OceanTundraDesert 等对象。是否存在任何问题或反对在堆栈上分配这些对象的有力论据,但是然后将指向这些对象的指针存储在指向生物群系的指针容器中? 我知道一旦封装对象超出范围,这些对象将被销毁,它们的指针将指向可能不存在的内存。

最佳答案

There are some strong arguments for initializing objects on the stack. Is there ever a good scenario to allocate memory on the heap?

当对象的数量或它们的实际类型仅在运行时(而非编译时)或较大时才知道时,您当然需要在堆中分配对象。你不想拥有大 call stack frames (一个典型的帧应该小于 1 千字节,因为整个堆栈小于 2 兆字节,并且您可以具有递归函数,或者只是非常深的函数)。

How does this work with polymorphic objects? For example, you have an abstract base class called Biome and you need a container of biomes. This container needs to store objects of Ocean, Tundra, Desert etc.

您的容器实际上将存储指向这些对象的指针。当然,您可能希望拥有智能指针。

关于C++ 将 RAII 与多态性和堆栈分配结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22440667/

相关文章:

c++ - Win32 API 中 PathAppend 和 PathCombine 的区别

java - Objective C 中的依赖注入(inject)/多态性

java - 普通多态性和使用泛型的多态性有什么区别?

c++ - std::mutex 最佳实践

c++ - ScopeGuard 在一个函数中使用多个资源分配和退出点

c++ - 如何使用 RAII 对套接字建模

C++ 问题 - 谁能帮忙?

c++ - 如何维护从基类派生的所有类型的编译时列表?

c++ - 对符号 '_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4' 的 undefined reference 在 Ubuntu 上构建 OpenCV

haskell - 为什么函数的类型从 GHCi 中的 monad 出来时会发生变化