Рассмотрите следующий код.Как избежать утечки памяти с помощью shared_ptr?
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;
}
Там не никакого вывода. Отсутствует дескриптор. Утечка памяти. Я всегда считал, что умный указатель помогает избежать утечек памяти.
Что делать, если мне нужны перекрестные ссылки в классах?
@Alexey, вот ссылка на документы, где она явно предупреждает об этой проблеме во введении. http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/shared_ptr.htm – Glen
Какой? И почему бы не заменить обе слабые ссылки? Это нелепо. 'shared_ptr' использовался по какой-то причине. – curiousguy
@curiousguy: Я не уверен, что понимаю ваш вопрос: что вы считаете смешным? Чтобы разбить цикл, вы должны заменить ссылку _one_ strong ссылкой на слабую ссылку; который полностью зависит от варианта использования. Вы не можете заменить все сильные ссылки слабыми ссылками, потому что тогда все объекты будут уничтожены, так как владельцев не осталось. –