我有一个代码,本质上是一个数据累加器,当我在服务器上运行它时,它几乎使用了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”释放我要求的内存?
答案 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;