2016-01-20 3 views
0

Я использую Visual Leak Detector, и он говорит, что у меня есть утечка памяти, когда я добавляю объект к vector<unique_ptr<Worker>> Workers.Утечка памяти при добавлении объекта в вектор <unique_ptr <Type>>

Я получил базовый класс с именем Worker с закрытым именем поля и одним производным классом Builder с частными кирпичами.

Вот как я добавляю новый объект в vector Workers.

Builder b = Builder(name, stoi(bricks)); 
    Workers.push_back(make_unique<Builder>(b)); // this is the line with memory leak 

Можете ли вы сказать мне, что следует делать, чтобы предотвратить утечку памяти в этом случае?

EDIT:

Я освобождаю память вектора, как это:

vector<unique_ptr<Worker>>().swap(Workers); 

Реализация Worker & Builder

Worker::Worker(string name) 
{ 
    this->_name = name; 
} 

деструктор работника является пустым.

Worker::~Worker() 
{ 

} 

Builder::Builder(string name, int bricks) : Worker(name) 
{ 
    this->_bricks = bricks; 
} 

И деструктор Builder пуст.

Builder::~Builder() 
{ 

} 
+2

Есть ли у 'Worker'' виртуальный деструктор? – Praetorian

+2

Можете ли вы показать реализации 'Worker' &' Builder' –

+0

Деструктор рабочего пуста пуст, так как есть только private: string name; –

ответ

0

Вы должны сделать рабочий деструктор виртуальным, так что бы уничтожить его как Builder и любые члены его и не только как работник.

У меня также есть некоторые виртуальные методы, переопределенные Builder, в основном это правило, что класс с виртуальным методом должен иметь виртуальный деструктор или защищенный деструктор, чтобы удалить его нельзя (что, конечно же, предотвратило бы его использование в unique_ptr).