C ++:这是内存泄漏吗?

时间:2013-12-17 23:50:05

标签: c++ memory-leaks

我创建了MyClass1的std :: vector。我没有使用任何指向该类的指针,所以我想知道:我使用std :: vector安全的方式还是我的内存泄漏问题?

我为什么要问它?我已经将构造函数和析构函数添加到MyClass1中,并且永远不会调用。那是我的代码:

class MyClass1 {
public:
    MyClass1() {
        printf( "constructor\n" );
    }
    ~MyClass1() {
        printf( "destructor\n" );
    }
    int var1;
    std::string str;
};

std::vector< MyClass1 > testArr;

MyClass1 gr1;

gr1.var1 = 111;
testArr.push_back( gr1 );

gr1.var1 = 122;
testArr.push_back( gr1 );

printf( "testArr.at( 1 ).var1 = %i\n", testArr.at( 1 ).var1 );

它调用构造函数,但它从不调用析构函数。

2 个答案:

答案 0 :(得分:3)

这是无泄漏的。

vector管理自己的内存,因此不会自行泄漏。你正在使用MyClass的本地实例并复制它们,这也不会泄漏。最后,MyClass的字符串成员以与vector相同的方式管理其内存,因此没有泄漏。

当担心泄漏时,只需避免使用原始的new / delete并使用智能指针,使用像你这样的标准容器,除非你真的需要,否则不要分配内存。

要解决缺少构造函数/析构函数调用的问题......您可能看到的是编译器优化的影响。尝试完全关闭优化后再次运行,并查看调用的内容。

编辑:

我刚刚运行了这段代码......

#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

class MyClass1 {
public:
    MyClass1() {
        printf( "constructor\n" );
    }
    ~MyClass1() {
        printf( "destructor\n" );
    }
    int var1;
    string str;
};

int main()
{
    vector< MyClass1 > testArr;

    MyClass1 gr1;

    gr1.var1 = 111;
    testArr.push_back( gr1 );

    gr1.var1 = 122;
    testArr.push_back( gr1 );

    printf( "testArr.at( 1 ).var1 = %i\n", testArr.at( 1 ).var1 );

   return 0;
}

...使用GCC 4.7.2,优化OFF并获得此输出:

constructor
destructor
testArr.at( 1 ).var1 = 122
destructor
destructor
destructor

答案 1 :(得分:1)

您展示的代码是无泄漏的。只有在调用testArr的析构函数或调用testArr.clear()时才会调用析构函数。

在示例中,gr1被复制或移动(如果可能)到向量中。当gr1超出范围,或者移除向量中的元素时,将调用析构函数。这些都不会发生在示例代码中,这意味着不会调用析构函数。

一旦方法退出(代码中未显示),您应该会看到析构函数被调用三次。 vector中的元素和gr1中的元素两次。