写作业时遇到了vector异常析构的问题,示例代码如下。
#include <iostream>
struct A {
int a;
std::vector<int> b;
A(int c) : a(c) {printf("构造:%d\n", a);}
~A() {printf("析构:%d\n", a);}
};
int main()
{
std::vector<A> a;
printf("1st:\n");
a.emplace_back(1);
printf("2nd:\n");
a.emplace_back(2);
printf("3rd:\n");
a.emplace_back(3);
printf("4th:\n");
a.emplace_back(4);
printf("5th:\n");
a.emplace_back(5);
printf("--End--\n");
}
获得的输出是:
1st:
构造:1
2nd:
构造:2
析构:1
3rd:
构造:3
析构:2
析构:1
4th:
构造:4
5th:
构造:5
析构:4
析构:3
析构:2
析构:1
--End--
析构:5
析构:4
析构:3
析构:2
析构:1
可以发现在emplace_back()后发生了很多意料之外的析构。
这是因为vector是变长数组,长度为n的数组满后会再开一个长度为2n的数组,并将各对象拷贝至新的数组中。
在vector变长时,首先调用对象的拷贝构造函数,再调用析构函数,实现对象的移动。
因此使用vector