【问题标题】:Can you dynamically allocate a vector?你能动态分配一个向量吗?
【发布时间】:2015-03-13 20:14:05
【问题描述】:

我需要我的向量容器在分配它的函数结束后持续存在。

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

为什么这无效?

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

【问题讨论】:

  • 能不能不退货?
  • 为什么需要这样做?您打算如何防止内存泄漏?
  • 你不能只传递一个空向量作为参考,然后在函数中做你需要做的事情吗?
  • 好问题,但我同意@juanchopanza。但是,如果您必须这样做,它是无效的,因为new 返回分配内存的句柄。要使其有效,您需要做的就是使R 成为std::vector&lt;obj&gt; 类型的指针。就像每个人都说的那样,如果您确实调用 new,请确保没有内存泄漏,请确保正确调用 delete

标签: c++ memory vector stl


【解决方案1】:

应该是vector&lt;obj1*&gt;* R = new vector&lt;obj1*&gt;;。但是,使用 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 在 cmets 中指出的那样,如果您有充分的理由这样做,请注意管理在堆上分配的向量的生命周期,R。这不是该语句特有的问题 - 它通常适用于动态分配的结构。但是,这里可能需要特别提及,因为您有一个 vector 的指针。除了正确管理R 的生命周期之外,您还需要仔细管理它所包含的obj1* 的生命周期。当持有它们的指针超出范围时,在堆上分配的对象不会被删除。完成使用后,您必须手动调用指向该内存位置的指针上的delete。这既适用于vector* R,也适用于它所包含的obj*,除非由程序的其他部分拥有。

【讨论】:

  • 然后他们有内存泄漏。
  • 这是一个奇怪的假设。 OP 的问题在于那行代码。这就是问题所在,这就是答案。您的评论就像是对询问有关new 语法的问题的人说“您将有内存泄漏”。我并不是建议他们将 new vector 留在那里,而不必费心清理它或担心它包含的指针。
  • @Pradhan:问题的关键是即使在函数结束后也能获得有效的std::vector。通过您的实现,要么他不会正确地deletevector,从而留下内存泄漏,要么他会正确地delete 它并且没有他想要的东西(有效的vector)。不管怎样,你的方法对他没有帮助。
  • 这不是一个奇怪的假设,因为 OP 显然不知道基本的东西,例如 new 返回一个指针。
  • @R1v2 编辑了更多细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 2012-01-22
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
相关资源
最近更新 更多