1

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 的对象的副本?

4

2 回答 2

3

你有内存泄漏,因为你打电话new但你没有打电话delete。此外,您没有理由new动态调用或分配。您可以简单地a自动分配。这同样适用于b

B b;
A a;

...   
b.add_a_to_b(a); // b stores a copy of `a`.
于 2016-01-04T20:33:42.223 回答
2

出色地。您为 a 分配内存,但从不使用 delete。

对于每一个新的,必须有一个删除。

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

你也可以这样做 - a = nullptr; 以避免悬空指针。

编辑:

您应该学习如何使用智能指针。它们相当容易学习,您不必担心使用 new 和 delete,它会处理删除。

阅读这个 - Wiki &什么是智能指针,我应该什么时候使用它?

于 2016-01-04T20:16:34.403 回答