gpt4 book ai didi

c++ - 智能指针和派生类

转载 作者:太空狗 更新时间:2023-10-29 20:21:56 24 4
gpt4 key购买 nike

我要在 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);
}

Live on Coliru

PS:考虑使用std::list::emplace_back更干净(更高效)的代码。

关于c++ - 智能指针和派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com