假设我有这些类:
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/