簡體   English   中英

如何管理指向已引用對象的內部數據的shared_ptr?

[英]How to manage shared_ptr that points to internal data of already referenced object?

假設我有這些類:

struct Engine {
  int engine_data;
};

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

出於性能原因,我想讓它們緊緊地包裝在內存中(但我不想失去設計的靈活性)。 所以,我可以創建一個“壓縮”結構,以及一個透明地返回一個新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。 當它死亡時,它將具有永久的引用計數。 你知道一個更好的方法來繼續使用內部的shared_ptr(如果我想的話,我可以將一個“解壓縮的”引用屬性),並仍然使這個打包結構?

UPDATE

我可以使用無操作刪除器,但如果我決定保留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

void nop(Engine*) { /* do nothing */ }

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

說明:此代碼創建一個shared_ptr,認為它擁有引擎但實際上它有一個單獨的引用計數器,並且在調用刪除器時它什么都不做。

暫無
暫無

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

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