这会导致内存泄漏吗?

时间:2019-01-10 21:01:20

标签: c++

我有一个代码,本质上是一个数据累加器,当我在服务器上运行它时,它几乎使用了100%的内存,更像是93%,但我怀疑有些东西使我无法达到100%。这很糟糕,我一直在积极尝试找出是否有潜在的内存泄漏。这是我的想法之一,也许有人可以告诉我这是否是原因。这是正在发生的事情的简化版本。

在我的代码中,我有两个类A和B。类B包含一些信息,并且类A累积B类并包含管理函数。 A的成员之一是Bs的向量。

我放入B的信息来自一个程序。该程序为我提供了有关类C的参考,该类C的信息太多,我只需要其中的一部分,因此我创建了B。

一旦Bs的向量足够大,我会将信息保存到文件中,清除向量并继续累积Bs。

立即取消引用新分配的内存会发生什么?情况如下所示:

    std::vector<B> Baccumulator;

    Baccumulator.push_back( *(new B(C)) );

让我们假设在保存和清除之前,我们仅将任意数量推回1 000 000次。根据我的平民知识,我用“ new”来请求内存,通过给它正确的参数来构造我的类B,然后向后推B,以在向量中创建新创建的B的副本。

由于副本已放入矢量中,我如何用“ new”释放我要求的内存?

2 个答案:

答案 0 :(得分:4)

是的,它会泄漏,但是好消息是您不必这样做。你可以简单地说

Baccumulator.push_back(B(C));

Baccumulator.emplace_back(C);

答案 1 :(得分:0)

仅凭经验即可:使用new创建的任何对象在某个时候都需要delete。您使用new,按值传递生成的(和取消引用的)对象,并且-您将失去对原始对象的跟踪-以后将没有机会delete->>内存泄漏。 / p>

为避免这种情况,您可以写...

Baccumulator.push_back(B(C));

Baccumulator.emplace_back(C);

B *b = new B(C);
Baccumulator.push_back(*b);
// do something else with 'b'
delete b;