如果在stl容器中传递用户定义的对象,对象的析构顺序是什么?

What is the order of object destruction if we pass user defined object in stl container?

本文关键字:对象 析构 顺序 是什么 定义 用户 stl 如果      更新时间:2023-10-16

为了检查stl容器中用户定义对象的销毁顺序,我测试了以下代码

class A
{
public: 
    static int i;
    const int j;
    A():j(++i)
    {
        cout<<"A::A() "<< j <<endl;
    }
    ~A()
    {
        cout<<"A::~A(): "<< j <<endl;
    }
    A(const A & obj):j(++i)
    {
        cout<<"copyconstro " << j <<endl;
    }
};
int A::i = 0;
int main()
{
    vector<A> obj;
    A ab; //1
    A ad;// 2
    A c;//3
    obj.push_back(ab); //4
    vector<A> obj2;
    obj2.push_back(c); //5
}
输出:

A::A() 1
A::A() 2
A::A() 3
copyconstro 4
copyconstro 5
A::~A(): 5
A::~A(): 3
A::~A(): 2
A::~A(): 1
A::~A(): 4

看完输出后,我有点困惑。

ISO c++标准是否规定了STL容器内对象的销毁顺序?

销毁顺序与它们的构造顺序相反。在你的函数中,销毁顺序是:

<>之前methodac广告abobj之前

obj2被破坏时,它会破坏5。

c被破坏时,它会破坏3。

ad被破坏时,它会破坏2。

ab被破坏时,它破坏1。

obj被析构时,它会析构4.

您的代码没有说明任何关于"STL容器内对象的销毁顺序"的内容-每个容器只有一个元素。您正在观察函数局部变量的(创建和)销毁顺序:注意,销毁顺序与构造顺序相反,特别是在定义obj时发生4的构造,而不是在ab的副本被push_back -ed到其中时,因此"4"被最后销毁。

无论如何,实际上回答你的问题——不——标准没有指定元素的销毁顺序。