使用函数初始化静态向量会给内存泄漏吗?

时间:2015-02-16 19:43:07

标签: c++ vector memory-leaks

我得到了以下代码。它汇编得很好。

class A
{
public:
  static std::vector<int> vInt;
  static std::vector<int> Foo()
  {
    std::vector<int> tmp;

    // EDIT: in the real application the values
    // inserted in the vector depends on the result
    // of other functions being called before Foo()
    tmp.push_back(7);
    tmp.push_back(9);
    return tmp;
  }
};

std::vector<int> A::vInt;

int main()
{
  // .... some code

  A::vInt = A::Foo();

  // .... more code
}

但我想知道它是否有内存泄漏?

我在想这行:

std::vector<int> A::vInt;

正在构建一个向量(一个空向量)。

但该行后来被该行替换:

  A::vInt = A::Foo();

所以第一个向量永远不会被破坏而且我有内存泄漏。 这是对还是错?

编辑: 我的初始排队没有提到在实际应用程序中我不能从一开始就调用Foo()。 Foo()返回的值取决于需要首先调用的其他函数。很抱歉不清楚...

4 个答案:

答案 0 :(得分:2)

通常,除非使用new运算符,否则不必担心泄漏。由于你没有动态分配(在堆上),任何东西都不会泄露;堆栈中的所有内容都将由确定性破坏来处理。

答案 1 :(得分:1)

因为您使用std::vector,所以没有泄漏。标准库会为您处理。

答案 2 :(得分:1)

你没有泄密,但代码对我来说仍然很复杂。我更喜欢这样的东西:

#include <vector>

class A
{
public:
    static std::vector<int> vInt;
};

std::vector<int> A::vInt{ 7, 9 };

int main()
{
    A a;
}

但一般来说,从函数返回局部向量是完全安全的。

理论上,编译器将编译器复制或移动到本地向量中,然后销毁本地。然后它将临时文件复制或移动到目的地并销毁临时文件。

标准明确允许绕过它 - 编译器可以(并且大多数)将对目标的引用传递给函数。函数中的代码将通过该引用直接写入目标,因此根本不会进行任何复制或移动。

仍然:在这种情况下,这是毫无意义的。只需初始化你定义它的向量,你就完成了(当然,除非你使用的是一个不支持它的旧编译器 - 但在这种情况下,如果可能的话,最好更新编译器,而不是编写蹩脚的代码以适应旧的编译器。

答案 3 :(得分:1)

您的代码不会泄漏。 Foo()返回的输出将被覆盖在A :: vInt的同一地址。 检查下面的Valgrind输出,这也表明没有泄漏:

==25088== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 1) ==25088== malloc/free: in use at exit: 0 bytes in 0 blocks. Write failed: Cannot allocate memoryrees, 20 bytes allocated. Amits-MacBook-Pro:~ kamal$ ected errors, rerun with: -v ==25088== All heap blocks were freed -- no leaks are possible.