【发布时间】:2016-01-04 20:10:58
【问题描述】:
Coverity 报告以下代码的泄漏。我需要一些帮助来理解错误并重新编写此代码以确保没有错误。 (错误在下面的代码中被注释为cmets)
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 的对象的副本?
【问题讨论】:
-
b->add_a_to_b( *a );这不存储指针。这确实是b->add_a_to_b( a );,但随后,您将不得不更改add_a_to_b的定义(或创建一个带指针的重载)。 -
@PaulMcKenzie 因此,即使 add_a_to_b 将引用作为参数,a_vector 也会存储提供给它的对象 A 的副本?
-
vector::push_back函数接受一个值并创建一个与您传递给它的值相同的新对象。 -
是的。副本存储在向量中。如果它是
vector<A*>,那么仍然会制作副本,但正在制作的副本是指针的副本。 -
如果 A 自己进行任何资源管理,这会使复制变得昂贵,如果 A 有移动构造函数,请考虑使用 emplace_back(std::move(a))。
标签: c++ memory-leaks coverity