我创建了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 );
它调用构造函数,但它从不调用析构函数。
答案 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
中的元素两次。