在上篇博文C++ std::vector元素的内存分配问题中我们已经明确了使用std::vector容器时元素在内存中的创建情况。
所以,我个人觉得使用std::vector<T> vec;
这种类型的最省时省力。
我们还是看原来的例子:
#include <iostream>
#include <vector>
using std::cout;
using std::vector;
class A
{
public:
A(); //构造函数
A(const A& a); //拷贝构造函数
~A(); //析构函数
};
A::A()
{
cout << "A的构造函数..." << '\n';
}
A::A(const A& a)
{
cout << "A的拷贝构造函数..." << '\n';
}
A::~A()
{
cout << "A的析构函数..." << '\n';
}
int main()
{
vector<A> vecA;
A a;
vecA.push_back(a);
return 0;
}
运行结果如下:
A的构造函数...
A的拷贝构造函数...
A的析构函数...
A的析构函数...
在main函数中我们创建了一个std::vector容器,创建了一个A对象,并将创建的A对象加入到std::vector容器中。在这个过程中,首先A a;
这一句使用A的构造函数初始化A对象,并且A对象是在栈上创建的。vecA.push_back(a);
在堆上拷贝构造了A,然后将原来栈上的A进行析构。所以,我们看到输出结果中先是调用A的拷贝构造函数,然后再调用A的析构函数。最后,在退出main函数之前,std::vector容器会自动再次调用A的析构函数销毁掉堆上的A。这就是整个过错。
所以,这样使用std::vector我们就不用担心对象的析构问题,因为std::vector会帮我们做最后的析构操作。唯一的确点就是中间存在对A对象的拷贝,可能稍微会影响性能,但是如果容器中的元素不多的时候,关系是不大的。