c++ - 如何管理指向已引用对象内部数据的 shared_ptr?

标签 c++ optimization shared-ptr smart-pointers pointer-aliasing

假设我有这些类:

struct Engine {
  int engine_data;
};

struct Car {
  shared_ptr<Engine> engine;
  int car_data;
};

出于性能原因,我想让它们在内存中紧密打包(但我不想失去设计的灵 active )。因此,我可以创建一个“打包”结构,以及一个将透明地返回新 B 实例的工厂:

struct PackedCarAndEngine {
    Engine engine;
    Car car;
};

shared_ptr<Car> new_Car() {
    shared_ptr<PackedCarAndEngine> packed = make_shared<PackedCarAndEngine>();

    // uses aliasing shared_ptr constructor
    packed->car.engine = shared_ptr<Engine>(packed, &packed->engine);

    // again
    shared_ptr<Car> car = shared_ptr<Car>(packed, &packed->car);

    return car;
}

问题是这个“汽车”实例永远不会被销毁,因为它的引用计数为 2。当它死亡时,它的引用计数将永远为 1。您是否知道继续使用内部 shared_ptr 的更好方法(以便我可以在需要时归因于“未打包”引用),并且仍然制作此打包结构?

更新

我可以使用空操作删除器,但如果我决定保留 engine 而不是 car ,那将是非常危险的:

    // ...
    packed->car.engine = shared_ptr<Engine>(&packed->engine, do_nothing_deleter);
    // ...

shared_ptr<Car> my_car = new_Car();
shared_ptr<Engine> my_engine = my_car->engine;
my_car.reset(); // Danger: engine was destroyed here!!!
cout << my_engine->engine_data; // Crash!

最佳答案

考虑在 struct Car 中使用 weak_ptr 而不是 shared_ptr,它不会影响引用计数,但可以转换为 shared_ptr 需要时。

关于c++ - 如何管理指向已引用对象内部数据的 shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4438886/

相关文章:

c++ - 如何动态调整数组的大小?

arrays - 查找 1 数量最多的行

c++ - 使用 shared_ptr 的找到/未找到指示

c++ - 如何检查从 C++ 字符串到 unsigned int 的转换

c++ - Opencv绘制等高线

c++ - 枚举电池设备 c++ windows

python - 使用 Python 进行 Digram 列表操作

python - 有效地计算没有尾随零的阶乘?

c++ - 为什么类的析构函数被调用了两次?共享指针

c++ - shared_ptr<> 到数组自定义删除器(使用 make_shared)