簡體   English   中英

智能指針和派生類

[英]Smart pointers and derived classes

我將在std::list存儲大量對象。

由於我需要這些對象來存儲不同類型的數據,因此我將指針存儲到一個基類,該基類只保存enum類型的屬性,該屬性告訴對象應該將哪個派生類轉換為它。 每個派生類都有自己的數據類型:

struct Base {
    enum class Type {
        D1,
        D2,
        ...
    } type;

    Base(Type new_type):
        type(new_type) {}
};

struct D1: public Base {
    std::string data;

    D1(std::string new_data):
        Base(Base::Type::D1), data(new_data) {}
};

struct D2: public Base {
    double data;

    D2(double new_data):
        Base(Base::Type::D2), data(new_data) {}
};

要保持指向這些對象的指針,我使用的是智能指針:

std::list<std::unique_ptr<Base>> list;
list.push_back(std::unique_ptr<Base>(new D1("Somestring")));
list.push_back(std::unique_ptr<Base>(new D2(3.14)));

但是,雖然每個Base對象都知道應該將哪種類型轉換為正確刪除,但智能指針只知道它必須調用Base的析構函數。 哪個會留下未刪除的每個子類分配的內存。

我如何將自定義刪除器傳遞給智能指針,以便他們知道如何正確地投射和釋放每個對象的內存? 我該如何實現自定義刪除工具?

只需將Base的析構函數標記為virtual 然后默認刪除器將調用delete pointer_to_raw_object; ,它將根據動態類型的object調用正確的析構函數。

例:

#include <iostream>
#include <memory>
#include <list>

struct Base
{
    virtual ~Base(){std::cout << __PRETTY_FUNCTION__ << std::endl;}
};

struct Derived : Base
{
    ~Derived() override {std::cout << __PRETTY_FUNCTION__ << std::endl;}
};

int main()
{
    std::list<std::unique_ptr<Base>> l;
    l.emplace_back(new Base);
    l.emplace_back(new Derived);
}

住在Coliru

PS:考慮使用std::list::emplace_back來獲得更清晰(更高效)的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM