use*_*072 3 c++ inheritance memory-management smart-pointers c++11
我将把大量的物品存放在一个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) {}
};
Run Code Online (Sandbox Code Playgroud)
要保持指向这些对象的指针,我使用的是智能指针:
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)));
Run Code Online (Sandbox Code Playgroud)
但是,虽然每个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);
}
Run Code Online (Sandbox Code Playgroud)
PS:考虑使用std::list::emplace_back更干净(更有效)的代码.
| 归档时间: |
|
| 查看次数: |
1722 次 |
| 最近记录: |