shared_ptr ланцуг/галіна з другім Deleter

У мяне ёсць сітуацыі, калі мне трэба ведаць, калі карыстальнік з shared_ptr робіцца, гэта значыць, калі карыстальнік нарэшце-то выпусціла ўсе копіі. Звычайна адзін раз выкарыстоўвае Deleter тут, але ёсць невялікі ўлоў ў гэтым выпадку. Асноўны аб'ект ужо shared_ptr!

Гэта значыць, у псеўда-кодзе:

shared_ptr a( new T );
.
.
.
shared_ptr b( a, bind( delete_func, id ) );

Я спарадзіўшы новую галіну роду ад арыгінальнага shared_ptr. Гэты новы shared_ptr б могуць быць скапіяваныя і выкарыстаны як звычайны shared_ptr але delete_func павінна быць выклікана, калі гэтая канкрэтная галіна робіцца. Зараз, я не магу проста выкарыстоўваць a.get() тут альбо, так як гэта новы shared_ptr павінен захаваць базавы аб'ект, а таксама (гэта можа быць апошнім shared_ptr для яго).

Я шукаю які-небудзь спосаб зрабіць гэта без таго, каб карэнным чынам змяніць структуру. Бачыць хто-небудзь добрае простае рашэнне?

Я выкарыстоўваю бібліятэку імпульс для смарт-паказальнікі і прывязкі.

1

2 адказы

Я прыйшоў з адным з магчымых рашэнняў.

Стварэнне функцыі DeleteR накшталт гэтага:

void delete_func( int id, shared_ptr underlying );

Затым ланцужку shared_ptr зрабіць гэта:

shared_ptr b( a.get(), bind( &delete_func, id, a ) );

Гэта стварае новую далучаную shared_ptr з наладжвальным Deleter (мой філіял). Адным з параметраў з'яўляецца арыгінальным shared_ptr, такім чынам, гэта павінна падтрымліваць базавы аб'ект shared_ptr, а таксама. Цяпер мне проста трэба, каб праверыць гэта няшмат.

0
дададзена
@visitor, гэта значыць менавіта тое, што патрабуецца. Па сутнасці б павінен мець сваю ўласную жыццё, што, калі ён сканчаецца сам Разрегистрирует праз Deleter.
дададзена аўтар edA-qa mort-ora-y, крыніца
Ці не будзе гэта назваць Deleter, калі апошні асобнік б выходзіць з вобласці бачнасці. Копіі а таксама можа быць у аб'ёме ў той час. - Чаму б проста не дадаваць прыстасаваныя Deleter да а , калі ён будзе створаны, у першую чаргу?
дададзена аўтар visitor, крыніца

Я не зусім разумею, чаму вы хочаце мець два асобных пласта shared_ptr , чаму б не проста забяспечыць адпаведны Deleter, які будзе апавяшчаць вас і затым выклікаць checked_deleter на паказальніку ? Такім чынам, вам трэба толькі адзін Deleter, і вы вярнуліся ў простай задачы забеспячэння адзін Deleter да shared_ptr .

0
дададзена
Улічыце, што а з'яўляецца часткай некаторага ўнутранага модуля. Функцыя называецца і мае патрэбу ў доступе да а а, але сістэма павінна ведаць, калі гэты знешні абанент робіцца з дапамогай яго. Такім чынам, ён не можа вярнуцца а непасрэдна, так як ён ніколі не ведаў бы тады, так што ў пэўным сэнсе ён павінен ўкараніцца ў жыццё гэтай новай копіі зменнай.
дададзена аўтар edA-qa mort-ora-y, крыніца