c++使用RAII与多态性和堆栈分配
C++ Using RAII with Polymorphism and Stack Allocation
我一直在研究RAII (http://tomdalling.com/blog/software-design/resource-acquisition-is-initialisation-raii-explained/),并有一些问题!
-
对于在堆栈上初始化对象有一些强有力的参数。有没有在堆上分配内存的好场景?
-
这是如何与多态对象工作的?例如,您有一个称为
Biome
的抽象基类,并且您需要一个生物群落的容器。该容器需要存储Ocean
,Tundra
,Desert
等对象。在堆栈上分配这些对象,然后将指向这些对象的指针存储在指向Biome的指针容器中,是否存在任何问题或强烈的反对意见?我知道,一旦封装对象超出作用域,这些对象将被销毁,它们的指针将被定向到可能不存在的内存中。
对于初始化堆栈上的对象,有一些强有力的参数。有没有在堆上分配内存的好场景?
当对象的数量或它们的实际类型仅在运行时(而不是在编译时)知道,或者当它很大时,您当然需要在堆中分配对象。你不希望有大的调用堆栈帧(一个典型的帧应该小于1千字节,因为整个堆栈小于2兆字节,你可以有递归的,或者只是非常深的函数)。
这是如何工作的多态对象?例如,您有一个名为Biome的抽象基类,并且您需要一个生物群落的容器。此容器需要存储海洋,苔原,沙漠等对象。
容器实际上将存储指向这些对象的指针。当然,您可能希望使用智能指针。
-
。RAII基于自动对象销毁,即编译器自动插入的析构函数调用。(编辑:我希望你的问题只是关于堆+RAII,而不是堆一般!)
-
不太好。根据我的经验,多态类通常不适合RAII,因为多态类对象的对象生命周期通常不对应于作用域。
只有生命周期100%符合作用域时,RAII才是真正的RAII。
下面是你的例子的三种可能的场景:
第一个程序逻辑:对象知道自己何时死亡,对外部事件作出反应。在这种情况下,它们通知容器它们的终止,然后调用delete this
。
for (auto element : m_elements) {
delete element;
}
(c++ 11语法)
第三个程序逻辑:对象由各种不同的组件所拥有,而不仅仅是容器,并且只有当最后一个组件死亡时它们才会死亡。在这种情况下,您可能会发现std::shared_ptr
(或c++ 11之前版本的boost::shared_ptr
)很有用。
- 从堆栈分配的原始指针构造智能指针
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- C++析构函数调用两次,堆栈分配的复合对象
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 何时在函数中声明堆栈分配变量?
- 使用 std::map 的递归堆栈分配如何工作?
- tcmalloc 与纯堆栈分配性能有多接近
- 安全分配堆栈分配的阵列
- C++ 中的黑白堆分配对象和堆栈分配对象的性能差异
- 跟踪(堆栈分配)对象
- 堆栈分配的确切时间
- 未初始化的值是由堆栈分配 - Qt - C++创建的
- 用于堆栈分配对象的C++虚拟析构函数内联
- C STD :: BAD_ALLOC来自堆栈分配
- 是使用COM创建的对象,将采用分配或堆栈分配的内存
- C++ 中针对大型的堆栈分配
- 堆栈分配的向量如何在 C++ 中扩展