我有一个函数,我想将一些对象存储到全局列表中。 两种方法都很好。但他们都在堆上创建变量吗? 他们之间有什么区别?
vector.push_back(* new object());
vector.push_back(object());
求助
DrTosh
答案 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
被调用(你不能)