C++:Coverity 报告引用和容器的特殊使用的泄漏
C++ : Coverity reports leaks for peculiar use of references and containers
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 函数的特殊问题,这可能反映了我对引用的不完整理解:Does a_vector store a reference to A or does it create a copy of the object passed到 add_a_to_b?
嗯。您为 a 分配内存,但您从不使用 delete。
每新建必有删。
delete a; // Do this when you don't need a anymore.
你也可以这样做 - a = nullptr;以避免悬空指针。
编辑:
你应该学习如何使用智能指针。它们相当容易学习,您不必担心使用 new 和 delete,它会处理删除。
读这个 - Wiki & What is a smart pointer and when should I use one?
您有内存泄漏,因为您调用了 new
而没有调用 delete
。此外,您没有理由调用 new
或动态分配。您可以简单地自动分配 a
。同样适用于 b
.
B b;
A a;
...
b.add_a_to_b(a); // b stores a copy of `a`.
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 函数的特殊问题,这可能反映了我对引用的不完整理解:Does a_vector store a reference to A or does it create a copy of the object passed到 add_a_to_b?
嗯。您为 a 分配内存,但您从不使用 delete。
每新建必有删。
delete a; // Do this when you don't need a anymore.
你也可以这样做 - a = nullptr;以避免悬空指针。
编辑:
你应该学习如何使用智能指针。它们相当容易学习,您不必担心使用 new 和 delete,它会处理删除。
读这个 - Wiki & What is a smart pointer and when should I use one?
您有内存泄漏,因为您调用了 new
而没有调用 delete
。此外,您没有理由调用 new
或动态分配。您可以简单地自动分配 a
。同样适用于 b
.
B b;
A a;
...
b.add_a_to_b(a); // b stores a copy of `a`.