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?

Author: jww, 2009-12-01

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śli main() posiada shared_ptr do A, który bezpośrednio lub pośrednio utrzymuje shared_ptr z powrotem do A, A'S Liczba użycia wyniesie 2. Zniszczenie oryginału shared_ptr pozostawi A zwisające z liczba użycia 1. Użyj weak_ptr, aby "przerwać cykle."

Dzięki, Glen, za link.

 48
Author: James McNellis,
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