写作业时遇到了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一定要写T的拷贝构造函数

最后修改:2023 年 07 月 11 日
如果觉得我的文章对你有用,请随意赞赏