为什么C ++不需要“new”语句来初始化std :: vector?

时间:2011-12-28 18:54:27

标签: c++ stl stdvector

/* 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实例?

7 个答案:

答案 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 *> foostd::vector<my_obj *> *foo不同。第二种情况需要你使用新的,而第一种情况不会。