【发布时间】:2020-04-10 14:26:05
【问题描述】:
假设我使用自定义删除器创建了一个共享指针。在下面的代码中,我想检查删除器对象本身会发生什么:
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());
}
我看到“删除器”类的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
会发生什么?为什么要复制这么多次?
【问题讨论】:
-
我懒得看实际的实现(你使用的是哪个库?)但是删除器可能是通过值传递的,因为它应该是一个简单的函数指针(或类似的),因此复制起来很便宜。这仍然是一个有趣的问题:我希望会有一些副本,但可能不会那么多。
-
你的问题是正确的,但如果你关心性能,可能你根本不应该使用
shared_ptr,因为它是性能方面最差的智能指针。weak_ptr是使用shared_ptr的唯一理由。
标签: c++ shared-ptr copy-constructor