shared_ptr тізбегі/екінші дефетермен тармағы

Менде share_ptr пайдаланушысы қалай жасалатынын білуім керек, яғни, ол, ең соңында, оның барлық көшірмелерін шығарды. Әдетте бұл жерде бір дефетер қолданылады, бірақ бұл жағдайда кішкене аулау бар. Негізгі нысан - shared_ptr!

Яғни жалған кодта:

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

Мен түпнұсқа shared_ptr-нің жаңа сорттарын өсіріп жатырмын. Бұл жаңа shared_ptr b көшірілуі мүмкін және қалыпты shared_ptr сияқты пайдаланылуы мүмкін, бірақ бұл тармақ аяқталғанда delete_func шақырылуы керек. Енді, бұл жерде жаңа кодты пайдалану мүмкін емес, себебі a.get() мұнда да, бұл жаңа shared_ptr негізгі объектіні сақтайды (бұл соңғы share_ptr болуы мүмкін).

Мен құрылымды түбегейлі өзгертуге тура келмей, мұны істеудің қандай да бір жолын іздеп жүрмін. Кез-келген адам қарапайым шешімді көре ме?

Мен смарт-көрсеткіштерге арналған кітапхананы қолданамын және байланыстырамын.

1

2 жауаптар

Мүмкін болатын шешіммен келдім.

Мынадай функцияны жасаңыз:

void delete_func( int id, shared_ptr underlying );

Содан кейін shared_ptr-ді тізбектеу үшін мына әрекеттерді орындаңыз:

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

Бұл теңшелетін deleter (менің филиалымыз) бар жаңа нескольким shared_ptr жасайды. Параметрлердің бірі түпнұсқа shared_ptr болып табылады, осылайша, бұл негізгі shared_ptr нысанын сақтауы керек. Енді мен тек біраз сынап көруім керек.

0
қосылды
@visitor, бұл дәл келеді. Негізінен b -тің өз өмірінің мерзімі болуы керек, ол ол аяқталғаннан кейін өздігінен жойылады.
қосылды автор edA-qa mort-ora-y, көзі
b соңғы көшірмесі ауқымнан шыққан кезде, ол deleter деп аталмайды. a көшірмелері сол уақытта ауқымда болуы мүмкін. - Неге бірінші кезекте құрған кезде, a -ге теңшелетін deleter қосасыз?
қосылды автор visitor, көзі

shared_ptr -дің екі бөлек қабатының болуын неге түсінгеніңізді түсінбеймін, неге сізді ескертетін тиісті сүзгіні бермей, одан кейін checked_deleter деген көрсеткішке ? Осылайша, сіз тек бір рет жіберіп, тек бір shared_ptr дегенді жөнелтудің қарапайым мәселесіне қайта ораласыз.

0
қосылды
a - кейбір ішкі модульдің бөлігі болып табылады. Функция шақырылады және a -ге қатынасуды қажет етеді, бірақ жүйе бұл сыртқы қоңырау шалушыны пайдаланған кезде білуі керек. Осылайша ол тікелей a кодын қайтара алмайды, себебі ол ешқашан білмейді, сондықтан қандай да бір жолмен бұл айнымалы жаңа көшірмесінің өміріне қосылу керек.
қосылды автор edA-qa mort-ora-y, көзі