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

Sch*_*lar 0 c++ memory stl vector

我需要我的矢量容器持久超过分配它的函数的末尾.

void initVector() {
    vector<obj1*> R;
}
Run Code Online (Sandbox Code Playgroud)

为什么这无效?

void initVector() {
    vector<obj1*> R = new vector<obj1*>;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*han 7

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

vector<obj1*> getVector()
{
 vector<obj1*> tempVec;
 //populate tempVec;
 return tempVec;//The standard guarantees a move at least. Compilers are free to elide this copy.
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如@juanchopanza在评论中指出的,如果你有充分的理由这样做,要警惕管理堆上分配的向量的生命周期,R.这不是特定于此语句的问题 - 它通常适用于动态分配的结构.但是,由于您有一些vector指针,因此可能需要特别提及.除了正确管理生命周期之外R,还需要仔细管理obj1*它所包含的生命周期.当持有它们的指针超出范围时,堆上分配的对象不会被删除.delete完成使用后,您必须手动调用指向该内存位置的指针.vector* R除非您的程序的某些其他部分拥有,否则这适用于obj*它包含的和.

  • 然后他们有内存泄漏. (3认同)
  • 假设OP显然不知道诸如`new`之类的基本内容返回指针,这并不是一个奇怪的假设. (2认同)