«Приобретение ресурсов — это инициализация» для решения проблемы утечки памяти

Я пытаюсь оптимизировать часть кода для проекта. Есть некоторый контекст, чтобы показать:

Class Basic
{
type* _shareResource;
virtual Basic(){};
virtual ~Basic(){};
virtual void initialResource() = 0;
virtual void deleteResource() = 0;
virtual void ownmethod() = 0;
static Basic* createChild(int condition);
}
Basic* Basic::createChild(int condtion)
{
Basic* pointer;
if (condition ==  1)
pointer = new ChildA();
else
pointer = new ChildB();
return pointer;
}Class ChildA::public Basic
{
void initialResource(){ allocate memory for _shareResource;}
void deleteResource(){ delete _shareResource; _shareResource = NULL;}
ChildA(){ initialResource(); }
~ChildA(){ deleteResource(); }
virtual ownmethod() {// child A method}

}

Class ChildB::public ChildA
{
void initialResource(){ allocate memory for _shareResource;}
void deleteResource(){ delete _shareResource; _shareResource = NULL;}
ChildB(){ initialResource(); }
~ChildB(){ deleteResource(); }
virtual ownmethod(){// child B method}
}

Итак, когда я использую Basic :: createChild () в качестве клиента:
Basic * aPointer = CreateChild (1);
// после некоторого использования клиент должен удалить этот понтер
удалить aPointer;

Однако RALL требует, чтобы Basic удалил сам себя без помощи клиента. Поэтому я пытаюсь изменить код. Что я сделал, это:

boost::share_ptr<Basic> Basic::createChild(int condtion)
{
boost::share_ptr<Basic> pointer;
if (condition ==  1)
pointer = boost::share_ptr<ChildA>(new ChildA());
else
pointer = boost::share_ptr<ChildA>(new ChildB());
return pointer
}

Но я получил дамп ядра как утечку памяти, я проверил его с помощью deleteResource () дочернего класса, но я не знаю почему.

Не могли бы вы помочь мне объяснить дамп ядра или предоставить лучшее решение по принципу RALL? Большое спасибо. (Я предпочитаю сохранять createChild как статический метод, так как моя оптимизация не должна изменять слишком много клиентского кода)

0

Решение

Почему так сложно!

class Shared
{
protected:
struct Implementation
{
virtual ~Implementation() {}
};

protected:
Shared(Implementation* p)
: m_self(p)
{}

private:
std/boost::shared_ptr<Implementation> m_self;
}

И имеют производные классы с вложенным классом, производным от Shared :: Реализация

Однако, передавая std / boost :: shared_ptr< SomeClass> сделал бы это тоже

2

Другие решения

Объявите деструктор Basic виртуальным. Вероятно, производные классы деструкторов не вызываются.

0