堆变量与否| * new Object()||宾语()?

时间:2017-05-16 13:32:53

标签: c++ heap

我有一个函数,我想将一些对象存储到全局列表中。 两种方法都很好。但他们都在堆上创建变量吗? 他们之间有什么区别?

vector.push_back(* new object());
vector.push_back(object());

求助

DrTosh

4 个答案:

答案 0 :(得分:4)

这是错误的:

vector.push_back(* new object());
不要这样做。您已经泄漏了内存,因为每个new必须与delete匹配,而您不会将其称为“{1}}。你能做的最好的事情就是永远不要打电话给new

没关系:

vector.push_back(object());

但是在C ++ 11中你可以更容易地做到这一点:

vector.emplace_back(/*any constructor args go here*/);

答案 1 :(得分:1)

new object()创建一个具有动态存储持续时间的匿名临时变量。

* new object()会给你一个可怕的内存泄漏,因为你没有存储来自new object()的指针,你只需取消引用它,并将其传递给push_back

所以不要这样做。

另一方面,object()是具有自动存储持续时间的匿名临时

答案 2 :(得分:1)

两者都将它们存储在向量中,向量本身在如何存储它们时是免费的,但它通常使用免费存储。

但是有一个很大的不同:

vector.push_back(* new object());

这会动态分配一个object对象,然后将该对象的副本保存在向量中,指向新分配的object的指针会立即被销毁。

这种方式导致内存泄漏,因为您没有delete object分配了new,也没有保存地址供以后使用。

vector.push_back(object());

这创建了一个临时的object,它被复制并存储在向量中然后被销毁,这是"正确的"向对象添加对象的方法。

答案 3 :(得分:-1)

它们类似于以下代码

object* temp = new object();
vector.push_back(*temp);

object temp;
vector.push_back(object);

它与vector无关,只是没有delete被调用(你不能)