你能动态分配一个向量吗?
Can you dynamically allocate a vector?
我需要我的向量容器在分配它的函数结束后继续存在。
void initVector() {
vector<obj1*> R;
}
为什么这无效?
void initVector() {
vector<obj1*> R = new vector<obj1*>;
}
应该是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*
,除非属于程序的其他部分。
我需要我的向量容器在分配它的函数结束后继续存在。
void initVector() {
vector<obj1*> R;
}
为什么这无效?
void initVector() {
vector<obj1*> R = new vector<obj1*>;
}
应该是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*
,除非属于程序的其他部分。