Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;结合多态性和堆栈分配使用RAII_C++_Polymorphism_Raii - Fatal编程技术网

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

C++ C++;结合多态性和堆栈分配使用RAII,c++,polymorphism,raii,C++,Polymorphism,Raii,我一直在研究RAII(),有很多问题 初始化堆栈上的对象有一些强有力的参数。有没有在堆上分配内存的好方案 这是如何处理多态对象的?例如,您有一个名为Biome的抽象基类,您需要一个biomes容器。此容器需要存储海洋、苔原、沙漠等对象。是否存在任何问题或强烈反对在堆栈上分配这些对象,然后将指向这些对象的指针存储在指向Biome的指针容器中我知道一旦封装对象超出范围,这些对象将被销毁,它们的指针将被寻址到可能不存在的内存。 初始化堆栈上的对象有一些强有力的参数。有没有在堆上分配内存的好方案 当对象

我一直在研究RAII(),有很多问题

  • 初始化堆栈上的对象有一些强有力的参数。有没有在堆上分配内存的好方案


  • 这是如何处理多态对象的?例如,您有一个名为
    Biome
    的抽象基类,您需要一个biomes容器。此容器需要存储
    海洋
    苔原
    沙漠
    等对象。是否存在任何问题或强烈反对在堆栈上分配这些对象,然后将指向这些对象的指针存储在指向Biome的指针容器中我知道一旦封装对象超出范围,这些对象将被销毁,它们的指针将被寻址到可能不存在的内存。

  • 初始化堆栈上的对象有一些强有力的参数。有没有在堆上分配内存的好方案

    当对象的数量或其实际类型仅在运行时(不是在编译时)或较大时才知道时,您当然需要在堆中分配对象。您不希望使用大的(一个典型的帧应该小于1 KB,因为整个堆栈小于2 MB,您可以使用递归函数,或者非常深入的函数)

    这是如何处理多态对象的?例如,您有一个名为Biome的抽象基类,您需要一个biomes容器。这个容器需要储存海洋、冻土带、沙漠等物体

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

  • 不。RAII基于自动对象销毁,即编译器自动插入的析构函数调用。(编辑:我希望你的问题只是关于heap+RAII,而不是一般的heap!)

  • 不太好。根据我的经验,多形类通常不适合RAII,因为多形类对象的对象生命周期通常不符合范围。只有当生存期100%对应于范围时,RAII才是真正的RAII

  • 以下是您的示例的三种可能场景:

    第一个程序逻辑:对象在死亡时知道自己,对外部事件作出反应。在这种情况下,他们会将他们的死亡通知他们的容器,然后调用
    delete this

    第二个程序逻辑:容器管理其生存期,在这种情况下,容器将对其析构函数中的每个元素调用delete:

    for (auto element : m_elements) {
        delete element;
    }
    
    (使用C++11语法)

    第三个程序逻辑:对象由各种不同的组件所拥有,而不仅仅是容器,并且只有当最后一个组件死亡时,对象才会死亡。在这种情况下,您可能会发现
    std::shared_ptr
    (或
    boost::shared_ptr
    在C++11之前的版本中)非常有用


    关键是:这些场景都与RAII无关,真的,因为在每一个场景中,生命周期都与范围不符。

    就你而言,这个问题太宽泛了。你应该对
    生物群落
    海洋
    苔原
    沙漠
    的关系有所了解。您遇到的最可能的问题是在某种程度上,另一个是正确的内存管理(如果可能的话,我建议)。很抱歉我不得不关闭投票…
    Ocean
    Tundra
    Desert
    extend
    Biome
    。这是关系的延伸。