/* bar.h */
class bar{
/* standard stuff omitted */
std::vector<my_obj*> foo;
};
/* bar.cpp */
bar::bar(){
// foo = new std::vector<my_obj*>(); <-- why don't I need this line??
foo.push_back(new my_obj());
}
为什么这个代码工作,即使我们没有给foo分配一个新的std :: vector实例?
答案 0 :(得分:46)
因为C ++不是C#/ Java。
std::vector<my_obj*> foo;
这是对象的定义,而不是C#/ Java中的引用。对象是类型的活实例。
new std::vector<my_obj*>()
此表达式返回指针。它返回std::vector<my_obj*>*
, 与foo
的类型相同(最后的*
是使它们不同的原因)。 foo
是一个对象,std::vector<my_obj*>*
是指向对象的指针。
对象(而不是指针或引用)具有特定的生命周期。如果创建指向具有new
的对象的指针,则指向的对象的生命周期将一直显式调用delete
。如果您将对象创建为另一个对象的成员,那么该内部对象的生命周期将(或多或少)镜像外部对象的生命周期。如果在堆栈上创建对象(函数作用域中的参数或变量),则其生命周期是该变量名称的当前范围。
答案 1 :(得分:6)
因为bar
包含std::vector
,而不是std::vector *
。
这与以下内容完全没有区别:
class bar
{
int foo; // No need to create a "new int"
};
答案 2 :(得分:5)
因为foo是一个对象而不是一个指针。
std::vector<my_obj*> // This is an object
std::vector<my_obj*> * // This is a pointer to an object
^^^ // Notice the extra star.
New rerturns指针:
new std::vector<my_obj*>(); // returns std::vector<my_obj*> *
PS。你的vector可能包含不是指针的对象。
std::vector<my_obj> foo;
...
foo.push_back(my_obj());
否则,当向量超出范围时(当包含对象被销毁时),您将需要手动删除向量中的所有对象。即如果你想在你的向量中保持指针,你应该做以下之一:
// 1. Manually delete all the elements in the vector when the object is destroyed.
~bar::bar()
{
for(std::vector<my_obj*>::iterator loop = foo.begin(); loop != foo.end(); ++loop)
{
delete (*loop);
}
}
// 2. Use a smart pointer:
std::vector<std::shared_ptr<my_obj> > foo;
// 3. Use a smart container for pointers
boost::ptr_vector<my_obj> foo
答案 3 :(得分:2)
因为std::vector
为你做了这个:)你没有指向std::vector
的指针,你只需要设置一个std::vector
类型的对象,它在内部分配内存你。
答案 4 :(得分:1)
std :: vector不是指针
答案 5 :(得分:1)
您不需要在new
上使用foo
,因为foo是vector
,而不是指向vector
的指针(即std::vector<my_obj*> *foo
)。
如果您来自Java或C#,您可能需要考虑使用std::vector<my_obj>
(对象向量)而不是指针向量。这实际上取决于你想做什么。
答案 6 :(得分:0)
std::vector<my_obj *> foo
与std::vector<my_obj *> *foo
不同。第二种情况需要你使用新的,而第一种情况不会。