疑问
vector销毁的时候是从前到后,还是从后到前?
之所以有这样的疑问,是因为发现在cpp.sh上面执行如下代码的时候,发现是从后往前一个个销毁的。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "Foo() this:" << this << endl;
}
~Foo()
{
cout << "~Foo() this:" << this << endl;
}
};
int main(int argc, char *[])
{
{
vector<Foo> vecF{};
vecF.resize(5);
for (auto &f : vecF)
{
cout << &f << endl;
}
vecF.clear();
}
cout << "---------------" << endl;
{
vector<shared_ptr<Foo>> ptrVec;
ptrVec.resize(3);
for (auto &p : ptrVec)
{
p = make_shared<Foo>();
}
cout << "---" << endl;
ptrVec.resize(5, make_shared<Foo>());
ptrVec.clear();
}
return 0;
}
输出结果:
然而在ubuntu上面,却是从前向后一个个销毁
另外,不管是调用vector的clear()函数,还是vector对象销毁的时候,执行效果都是一样的(cpp.sh和ubuntu上面都一样)。
结论
vector销毁的时候是从前到后,还是从后到前?
也许c++标准并没有做出明确规定。
另外,本例可以看出第37行中,make_shared<Foo>()只会执行一次。
ptrVec.resize(5, make_shared<Foo>());