Coverity сообщает об утечках для следующего кода. Я хотел бы помочь понять ошибки и переписать этот код без ошибок.
(Ошибки помечены как комментарии в коде ниже)
int main()
{
...
B* b = ...
// (1) Coverity: Storage is returned from
// allocation function operator new
// (2) Coverity: Assigning ...
A* a = new A();
// (3) Coverity: noescape: Resource a is not freed
// or pointed-to in add_a_to_b
b->add_a_to_b( *a );
...
// (4) Coverity: Resource leak: Variable a going out
// of scope leaks the storage it points to.
}
class B {
public:
std::vector<A> a_vector;
void add_a_to_b( const A& a )
{
a_vector.push_back( a );
}
— РЕДАКТИРОВАТЬ —
У меня был конкретный вопрос о функции B :: add_a_to_b, и это, возможно, отражает мое неполное понимание ссылок: сохраняет ли a_vector ссылку на A или создает копию объекта, переданного в add_a_to_b?
У вас утечка памяти, потому что вы позвонили new
и ты не звонишь delete
, Кроме того, у вас нет причин звонить new
или выделить динамически. Вы можете просто выделить a
автоматически. То же самое относится и к b
,
B b;
A a;
...
b.add_a_to_b(a); // b stores a copy of `a`.
Что ж. Вы выделяете память для a, но вы никогда не используете delete.
Для каждого нового должно быть одно удаление.
delete a; // Do this when you don't need a anymore.
Вы также можете сделать это — a = nullptr; чтобы избежать висящего указателя.
Редактировать:
Вы должны научиться пользоваться умными указателями. Их довольно легко выучить, и вам не придется беспокоиться об использовании новых и удаленных файлов, они позаботятся об удалении.
Прочитай это — Wiki & Что такое умный указатель и когда я должен его использовать?