如果在stl容器中传递用户定义的对象,对象的析构顺序是什么?
What is the order of object destruction if we pass user defined object in stl container?
为了检查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"被最后销毁。
无论如何,实际上回答你的问题——不——标准没有指定元素的销毁顺序。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- C++包含包含指针的对象的对象析构函数
- C++类对象析构函数控件
- Objective-C++C++对象析构函数
- 结构对象析构函数
- 在Exit()时调用基本对象析构函数