WeakPointers vs. SmartPointers

8 отговора 328 прегледа
#1

WeakPointers vs. SmartPointers

njakoi ako mozhe da wkara razjasnenia,
dneska gledah koda - i nashia lead e wkaral
nekakwi takviz raboti....

dokolkot znam WeakPointer e SmartPointer kojto ne durzhi sobswenika si....

njakoi da wkara razjasnenia i primeri?

Um tzaruwa, Um robuwa, Um belia delfin
Отговор
в отговор на malkia #2

Re: WeakPointers vs. SmartPointers

Ami ti si si go kazal - weak pointer e pointer, koito ne manage-va allocation/freeing na tova, kym koeto sochi.
Klasicheski primer - vseki STL-ski konteiner, koito pazi heap-ovi obekti T* - da rechem std::vector<Human*>. Ako pylnish vektora s my_vec.push_back(new Human), to nakraja trebe da delete-nesh vseki edin obekt ot vectora ti (ili da si nasledish ot std::vector<Human*> i da prenapishesh clear(), makar che stava mnogo vyrzano ). Prosto konteinera e konteiner - na nego rabotata mu e da pazi obekti, a ne da ima znanie kakvo e tova pamet, kakvo e obekt i koga da se trie ili syzdava. Da ne govorim, che ako konteinera imashe pravo da trie pri pop-back, to v takyv konteiner NE MOJESH da pazish per-process singleton-i.

Ponjakoga weak pointerite sa po-polezni ot Smart pointerite - Reference counted smart pointerite imat probem sys circular referencite. Primerno obekta A ima reference-counted pointer, koito sochi kym B i obratnoto, to automatically njama da se iztrijat dvata obekta. Syshtija problem se reshava v java garbage collection-a s dosta slojni algoritmi. Njakyde bjah chel, che stava hitro da se polzvat kombinacijata ot dvete - smart plus weak pointeri, kato se izpolzvat dobrite strani na dvete - toest kato smart pointer ref count-a stane nula, toi reset--va weak pointera na NULL.

Отговор
в отговор на manski #3

Re: WeakPointers vs. SmartPointers

Mmmm ne, GC to na Java i .NET za razlika ot VB ne polzva reference counting, taka che circular referencite vuobste ne igraiat prosto se vijda che v grafa ot obekti niama put kum tiah i se mahat.

Отговор
в отговор на malkia #4

Re: WeakPointers vs. SmartPointers

Weak pointer se izpolzwa, za da se izbegne circular reference.
W COM towa se postiga kato NE se prawi AddRef na pointera, kojto ti e daden.
Estestweno trjabwa da si siguren che lifetime na dadenia obekt e po-goljam ot twoja lifetime.

Отговор
в отговор на malkia #5

Re: WeakPointers vs. SmartPointers

Weak pointers v C++ za pruv put chuvam, no primerno v .NET i Java weak refernce (pointer) se vika na ukazatel kum nesto, koito ukazatel obache ne se ima v predvid ot GC-to t.e. ako se runne GC-to i to reshi che niama pamet moje da osvobodi pametta sochena ot tozi ukazatel, a ti prosto vseki put kogato reshish da go polzvash proveriavash dali sluchaino ne e stanal null t.e. mahnat. Ima prilojenie kogato pametta e malko.

Отговор
в отговор на pm #6

Re: WeakPointers vs. SmartPointers

Da, prav si.
Az po-skoro imah predvid circular referencing-a kato cjalo. Primer na java, koito GC shte-neshte trjabva da resolv-ne:

class Something {
OtherThing other;
}
class OtherThing {
Something smth;
}


public void AFunc() {
Something A = new Something();
OtherThing B = new OtherThing();
A.other = B;
B.smth = A;
// end of function, beware GC !
}


Vse pak GC-to trjabva da zabeleji, che A i B sa reference-vat, no ot otsechen (izoliran) graf, taka che celija graf trjabva da si otide.

Отговор
в отговор на manski #7

Re: WeakPointers vs. SmartPointers

Shte se opravi s tova. GC na java i .net purvo markira vsichko za bokluk, sled tova trugva ot root obektite v momenta (globalni promenlivi, promenlivite v steka i registrite) i obhojda grafa, kato mine prez niakoi obekt maha flaga za bokluk i nakraia vsichko deto ostane bokluk otlita. Sega, GC s reference counting se pravi kogato iskash da imash deterministichen GC t.e. vednaga da se unistojava kogato refcount=0 i v predskazuem red, no puk si imash problemi s skorostta i ciclite.
Dokolkoto znam MS iako sa mislili kak da gi kombinirat dvata podhoda za da vzemat hubavoto i ot dvete ama ne sa uspeli, daje po edno vreme predlagaha nezabavno naznachavane na tozi koito ima chitavi idei po vuprosa :)))

Отговор
в отговор на malkia #8

Re: WeakPointers vs. SmartPointers

taka e ,
vigdate li ko stava kogato ne si si 4el COM domashnoto

Отговор
в отговор на AlllnWonder #9

Re: WeakPointers vs. SmartPointers

Deeiba teja zubrachi - dumashnutu po COM si chetat! Az gde bleeh che ne sum si go chel! tva da ne e Vazov, ili Elin Pelin! tva e COM ti kazwam, kiflooo!

Izwinjawaj az sum tup C programist - kon s kapatzi :) sam si go kazah!

Taka de - pone blagodarja na prednite ljude za razjasnenieto po wuprosa!

Um tzaruwa, Um robuwa, Um belia delfin
Отговор