2009-04-29 2 views
6

См. Также: Similar questionКак вы должны возвращать * с помощью shared_ptr?

Код, очевидно, опасен. Вопрос в следующем: как вы отслеживаете ссылку на это?

using namespace boost; 

// MyClass Definition 
class MyClass { 

public: 
    shared_ptr<OtherClass> createOtherClass() { 
     return shared_ptr<OtherClass> OtherClass(this); // baaad 
    } 
    MyClass(); 
    ~MyClass(); 
}; 

// OtherClass Definition 
class OtherClass { 

public: 
    OtherClass(const *MyClass myClass); 
    ~OtherClass(); 
}; 

// Call; pMyClass refcount = 1 
shared_ptr<MyClass> pMyClass(new MyClass()); 

// Call; pMyClass refcount = 1 => dangerous 
pMyClass->createOtherClass(); 

У меня есть ответ (отправил ниже), я просто хочу, чтобы это было на StackOverflow (где каждый может исправить меня, если я ошибаюсь.)

+1

Не знаете, почему это отклоняется .. из FAQ: Также отлично спросить и ответить на свой собственный вопрос программирования [..] –

+0

Возможно, что нисходящий поток был из-за того, что код, который вы опубликовали в вопросе, выиграл Компиляция. – 2009-04-29 12:59:35

+0

К сожалению, дело не в том, чтобы предоставить компилируемый код, а вместо этого, чтобы проиллюстрировать эту точку с ненужными деталями. –

ответ

7

Ключ продлить enable_shared_from_this<T> и использовать shared_from_this() метод, чтобы получить shared_ptr к *this

For detailed information

using namespace boost;  

// MyClass Definition 
class MyClass : public enable_shared_from_this<MyClass> { 

public: 
    shared_ptr< OtherClass> createOtherClass() { 
     return shared_ptr<OtherClass> OtherClass(shared_from_this()); 
    } 
    MyClass(); 
    ~MyClass(); 
}; 

// OtherClass Definition 
class OtherClass { 

public: 
    OtherClass(shared_ptr< const MyClass > myClass); 
    ~OtherClass(); 
}; 

// Call; pMyClass refcount = 1 
shared_ptr<MyClass> pMyClass(new MyClass()); 

// Call; pMyClass refcount = 2 
pMyClass->createOtherClass(); 
+0

+1 для статьи, связывающей объяснение –

1

пара проблем:
Ваш код не компилируется!

Ваш код не разработан таким образом, что он останавливает злоупотребление/неправильное использование:

MyClass   x; 
SharedPtr<MyClass> y = x.createOtherClass(); 

что теперь?
Это кажется совершенно хорошим вариантом использования!

+0

Ваш второй пункт находится прямо на. Связанная статья гласит: «Имейте в виду, что объект, который вы называете shared_from_this, должен принадлежать объекту shared_ptr». Лучше всего сделать ctor private и предоставить именованный конструктор (статический метод), который возвращает shared_ptr для обеспечения правильного создания. – Dan

Смежные вопросы