C ++: Coverity сообщает об утечках для специфического использования ссылок и контейнеров

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?

1

Решение

У вас утечка памяти, потому что вы позвонили new и ты не звонишь delete, Кроме того, у вас нет причин звонить new или выделить динамически. Вы можете просто выделить a автоматически. То же самое относится и к b,

B b;
A a;

...
b.add_a_to_b(a); // b stores a copy of `a`.
3

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

Что ж. Вы выделяете память для a, но вы никогда не используете delete.

Для каждого нового должно быть одно удаление.

delete a; // Do this when you don't need a anymore.

Вы также можете сделать это — a = nullptr; чтобы избежать висящего указателя.

Редактировать:

Вы должны научиться пользоваться умными указателями. Их довольно легко выучить, и вам не придется беспокоиться об использовании новых и удаленных файлов, они позаботятся об удалении.

Прочитай это — Wiki & Что такое умный указатель и когда я должен его использовать?

2

По вопросам рекламы [email protected]