2013-09-18 3 views
0

У меня есть 2 класса, A и B.Как я могу использовать shared_ptr boost в этой ситуации?

В классе A у меня есть указатель на B, называемый Bptr.

Я выделяю память для Bptr в конструкторе A, и я освобождаю память Bptr в деструкторе A.

class B { 
//whatever 
public: 
    B(int,int); 
} 

class A { 
private: 
    B * Bptr; 
public: 
    A(); 
} 

A::A(){ 
    Bptr = new B(2,5); 
} 

A::~A(){ 
    delete Bptr; 
} 

Как я могу интегрировать подталкивание в моем коде и использовать смарт-указатель: повышение :: shared_ptr? Как бы выглядел мой код?

Большое спасибо!

+0

Вы прочитали [документацию] (http://www.boost.org/doc/libs/1_54_0/libs/smart_ptr/shared_ptr.htm)? Я немного смущен тем, о чем именно вам интересно. – us2012

ответ

0
class B { 
//whatever 
public: 
    B(int,int); 
} 

class A { 
private: 
    boost::shared_ptr<B> Bptr; 
public: 
    A(); 
} 

A::A(){ 
    Bptr = boost::make_shared<B>(2,5); 
} 

A::~A(){ 
    // Bptr automatically deleted if this is the only boost::shared_ptr pointing to it 
} 

Хотя вы могли просто использовать new B(2,5) вместо boost::make_shared<B>, последний является исключением безопасной.

+0

@ us2012 oops copy/paste typo. good catch –

+0

Можете ли вы уточнить условие: «если это единственный boost :: shared_ptr, указывающий на него»? Если это не единственный, как я могу справиться? Обратите внимание: я в многопоточном контексте. Благодаря! –

+1

@ user1459961: Если это не единственный владелец, тогда его уничтожение просто освобождает свою долю владения без удаления объекта. Объект будет удален при уничтожении последнего общего указателя. Вам не нужно ничего делать, чтобы справиться с этим. –

1

Первый вопрос: спросите себя: почему вы хотите динамически распределить объект в первую очередь? Можете ли вы просто заменить указатель на элемент типа B?

Предполагая, что есть веская причина, то почему shared_ptr (а не scoped_ptr или, в современном C++, unique_ptr)? Зачем вам нужно совместное владение?

После того как вы ответили на эти вопросы и решили, что совместное владение является правильным решением, просто замените B* на общий указатель, инициализируйте его в конструкторе и избавьтесь от избыточного деструктора (если он не нужен ни для чего еще).

class A { 
private: 
    boost::shared_ptr<B> Bptr; 
public: 
    A() : Bptr(boost::make_shared<B>(2,5)) {} 
}; 

Вы могли бы просто отформатируйте ее с указателем, Bptr(new B(2,5)), но с использованием make_shared делает более эффективное использование памяти и (в более сложных ситуациях, чем это) делает его легче обеспечить безопасность исключений.

+0

+1 для умных вопросов. Мой босс сказал, что это для многопоточности. Я не проверял, прав ли он в этом. –

+0

Для использования он: Bptr-> B_attribute_1, имеющий B_attribute_1 общедоступный атрибут B, правильно? Спасибо –

+1

@ user1459961: Да, умные указатели предоставляют '*' и '->' операторы, поэтому они могут быть разыменованы как обычные указатели. –

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