2011-12-28 189 views
15
/* 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的新实例?为什么不需要使用“新”来初始化std :: vector?

+0

他们说的。另外,我不推荐'foo.push_back(new my_obj());'因为你要在那里释放内存? – 2011-12-28 19:05:28

回答

33

因为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。如果您创建一个对象作为另一个对象的成员,那么该内部对象的生命周期将(或多或少)镜像外部对象的生命周期。如果您在堆栈上创建一个对象(函数范围中的参数或变量),那么它的生命周期就是该变量名的当前范围。

6

因为bar包含std::vector,而不是std::vector *

这东西真的没有不同的是这样的:在这个库

class bar 
{ 
    int foo; // No need to create a "new int" 
}; 
1

的std ::向量不是指针

0

std::vector<my_obj *> foostd::vector<my_obj *> *foo不同。第二种情况将需要你使用新的,而第一个不会。

2

因为std::vector会替你:)你没有指针std::vector,你只需设置std::vector类型,其内部为你分配内存的对象。

0

你并不需要在foo使用new,因为foo是一个vector,而不是一个指向vector(即std::vector<my_obj*> *foo)。

如果您来自Java或C#,您可能需要考虑使用std::vector<my_obj>(对象向量)而不是指针向量。这真的取决于你想要做什么。

3

因为foo是一个不是指针的对象。

std::vector<my_obj*> // This is an object 
std::vector<my_obj*> * // This is a pointer to an object 
        ^^^ // Notice the extra star. 

新rerturns指针:

new std::vector<my_obj*>(); // returns std::vector<my_obj*> * 

PS。你的矢量应该可能包含对象而不是指针。

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 
相关问题