你能动态分配一个向量吗?

时间:2015-03-13 20:14:05

标签: c++ memory vector stl

我需要我的矢量容器在分配它的函数的末尾持续存在。

void initVector() {
    vector<obj1*> R;
}

为什么这无效?

void initVector() {
    vector<obj1*> R = new vector<obj1*>;
}

1 个答案:

答案 0 :(得分:7)

应该是vector<obj1*>* R = new vector<obj1*>;。但是,使用C ++ 11的移动语义,通常不需要使用指针或引用来避免昂贵的副本。对于vector,以下代码不会复制tempVec - 它至少会移动它。编译器更有可能忽略副本。您可以阅读更多相关信息here

vector<obj1*> getVector()
{
 vector<obj1*> tempVec;
 //populate tempVec;
 return tempVec;//The standard guarantees a move at least. Compilers are free to elide this copy.
}
编辑:正如@juanchopanza在评论中指出的那样,如果您有充分的理由这样做,请注意管理堆上分配的向量的生命周期R。这不是特定于此语句的问题 - 它通常适用于动态分配的结构。但是,由于您有一个vector指针,因此可能需要特别提及。除了正确管理R的生命周期外,您还需要仔细管理其中包含的obj1*的生命周期。堆栈上分配的对象在保存它们的指针超出范围时不会被删除。完成使用后,您必须在指向该内存位置的指针上手动调用delete。这既适用于vector* R,也适用于您的计划的其他部分所属的obj*