C++ 这会导致内存泄漏吗

C++ 这会导致内存泄漏吗,c++,C++,我有一个基本上是数据累加器的代码,当我在服务器上运行它时,它几乎使用了100%的ram,更像是93%,但我怀疑有什么东西阻止我达到100%。这很糟糕,我一直在积极尝试找出是否存在潜在的内存泄漏。这是我的一个想法,也许有人能告诉我这是否是原因。下面是正在发生的事情的简化版本 在我的代码中,我有两个类A和B。类B包含一些信息,类A累加B类并包含管理函数。A的一个成员是B的向量 我在B中输入的信息来自一个程序。这个程序给了我一个C类的引用,它有太多的信息,我只需要其中的一部分,所以我创建了B 一旦Bs

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

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

我在B中输入的信息来自一个程序。这个程序给了我一个C类的引用,它有太多的信息,我只需要其中的一部分,所以我创建了B

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

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

    std::vector<B> Baccumulator;

    Baccumulator.push_back( *(new B(C)) );
std::向量累加器;
B累计器。推回(*(新B(C));
让我们假设,在保存和清除之前,对于任意数字,我们向后推100万次。根据我的平民知识,我用“new”来请求记忆,通过给它正确的参数来构造我的类B,然后推回B,在向量中创建新创建的B的副本


既然拷贝放在向量中,我如何释放我用“new”请求的内存

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

Baccumulator.push_back(B(C));


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

Baccumulator.push_back(B(C));


正如经验法则一样:使用
new
创建的任何对象在某个时候都需要
delete
。使用
新对象
,按值传递生成的(和取消引用的)对象,并且由于会丢失对原始对象的跟踪,因此以后将没有机会
删除它->>内存泄漏

为了避免这种情况,你可以写

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;

正如经验法则一样:使用
new
创建的任何对象在某个时候都需要
delete
。使用
新对象
,按值传递生成的(和取消引用的)对象,并且由于会丢失对原始对象的跟踪,因此以后将没有机会
删除它->>内存泄漏

为了避免这种情况,你可以写

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;

bacumulator.push_back(B(C))
*新的
几乎自动成为泄漏。理论上,你可以保留对它的引用,然后删除引用的地址,但在这一点上,你只是想找个借口,让
*新的
起作用。我想也有
和*new
,但同样,没有真正的理由选择这样做。@FrançoisAndrieux或者您正在使用Qt,您的
新的
小部件会立即以其参数作为父项。但肯定不是常见用法。“既然拷贝放在向量中,如何释放我用“new”要求的内存?”-你不能。你有漏洞。@Quentin我承认我没有想到对象会自动注册。
baccumerator.push_back(B(C))
*新的
几乎自动成为泄漏。理论上,你可以保留对它的引用,然后删除引用的地址,但在这一点上,你只是想找个借口,让
*新的
起作用。我想也有
和*new
,但同样,没有真正的理由选择这样做。@FrançoisAndrieux或者您正在使用Qt,您的
新的
小部件会立即以其参数作为父项。但肯定不是常见用法。“既然拷贝放在向量中,如何释放我用“new”要求的内存?”-你不能。你有漏洞。@Quentin我承认我还没有想到注册对象本身的情况。