【发布时间】:2023-03-11 15:02:01
【问题描述】:
据我所知,从容器中删除元素时会调用析构函数,如果我错了,请纠正我。但是 Destr X 打印不应出现在 after 删除之前
#include <iostream>
#include <memory>
#include <vector>
struct X
{
X()
{
std::cout<<"Contr X"<<std::endl;
}
~X()
{
std::cout<<"Destr X"<<std::endl;
}
};
using Xptr = std::shared_ptr<X>;
int main()
{
std::shared_ptr<X> x = std::make_shared<X>();
Xptr x2 = std::make_shared<X>();
std::vector<Xptr> v;
v.emplace_back(x);
v.emplace_back(x2);
v.erase(v.begin());
std::cout<<"after erase\n";
return 0;
}
【问题讨论】:
-
向量中的
shared_ptr在您擦除时被 销毁,但它喜欢共享的X仍然有一个所有者(即x)。共享对象在其所有所有者都对其失去兴趣之前不会被销毁。 -
你是对的。 Xptr 被破坏
v.erase(v.begin());。 Xptr 析构函数说“哦,X 上还有另一个活 Xptr,所以不会在这里破坏它。一切都完成了,再见。” -
“Destr X 打印不应出现在擦除后”之前。你是对的,他们不应该,他们don't。你有什么问题?