假设我使用自定义删除器创建一个共享指针。在下面的代码中,我想检查删除器对象本身会发生什么:
struct A {
A() { std::cout << "A\n"; }
~A() { std::cout << "~A\n"; }
};
struct D {
D() {
std::cout << "D\n";
}
~D() {
std::cout << "~D\n";
}
D(const D&) {
std::cout << "D(D&)\n";
}
void operator()(A* p) const {
std::cout << "D(foo)\n";
delete p;
}
};
int main()
{
std::shared_ptr<A> p(new A, D());
}
我看到“deleter”类的 D(const D&)
和 ~D()
又被调用了六次:
D
A
D(D&)
D(D&)
D(D&)
D(D&)
D(D&)
D(D&)
~D
~D
~D
~D
~D
~D
D(foo)
~A
~D
会发生什么?为什么需要复制这么多次?
最佳答案
我用 gcc 7.4 检查了你的代码,我得到了相同数量的析构函数调用。您观察到删除器对象通过 std::move(deleter)
移动了六次。
当您向类添加析构函数时,默认移动语义的自动生成将被禁用,您需要显式定义它们:
D(D&&) = default;
D& operator=(D&&) = default;
但是,即使使用移动语义,析构函数仍然可以被调用最多六次。
关于c++ - 带有删除器类的shared_ptr - 为什么删除器被复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59385168/