Ответ на ваш вопрос: RAII (Инициализация ресурсов - инициализация).
Но ваш пример опасен:
Решение 1 использовать умный указатель:
class A
{
public:
A(): m_b(new B) {}
private:
boost::shared_ptr<B> m_b;
};
Решение 2: Запомните правило 4:
Если ваш класс содержит «собственный указатель RAW», вам необходимо переопределить все методы, сгенерированные компилятором.
class A
{
public:
A(): m_b(new B) {}
A(A const& copy): m_b(new B(copy.m_b)) {}
A& operator=(A const& copy)
{
A tmp(copy);
swap(tmp);
return *this;
}
~A()
{
delete m_b;
}
void swap(A& dst) throw ()
{
using std::swap;
swap(m_b, dst.m_b);
}
private:
B* m_b;
};
Я использую термин «Owned RAW Pointer» выше, так как это самый простой пример. Но RAII применим ко всем ресурсам, и когда ваш объект содержит ресурс, которым вы должны управлять («Owner RAW Poiner», DB Handle и т. Д.)