Jak uniknąć wycieku pamięci na współdzielonym PST?
Rozważ następujący kod.
using boost::shared_ptr;
struct B;
struct A{
~A() { std::cout << "~A" << std::endl; }
shared_ptr<B> b;
};
struct B {
~B() { std::cout << "~B" << std::endl; }
shared_ptr<A> a;
};
int main() {
shared_ptr<A> a (new A);
shared_ptr<B> b (new B);
a->b = b;
b->a = a;
return 0;
}
Nie ma żadnego wyjścia . nie jest wywoływany żaden deskryptor . Wyciek pamięci. Zawsze wierzyłem, że inteligentny wskaźnik pomaga uniknąć wycieków pamięci.
Co powinienem zrobić, jeśli potrzebuję odsyłaczy w klasach?
1 answers
Jeśli masz takie odniesienia okrągłe, jeden obiekt powinien posiadać weak_ptr
do drugiego, nie shared_ptr
.
From the shared_ptr
introduction:
Ponieważ implementacja używa zliczania referencji, cykle instancji
shared_ptr
nie będą odzyskiwane. Na przykład, jeślimain()
posiadashared_ptr
doA
, który bezpośrednio lub pośrednio utrzymujeshared_ptr
z powrotem doA
,A
'S Liczba użycia wyniesie 2. Zniszczenie oryginałushared_ptr
pozostawiA
zwisające z liczba użycia 1. Użyjweak_ptr
, aby "przerwać cykle."
Dzięki, Glen, za link.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-01 15:39:47