在最近的重载期刊中,主题为“执行零规则”,作者描述了如何避免编写五个运算符的规则,因为编写它们的原因是:
而且,可以通过使用智能指针来解决这两个问题。
在这里,我对第二部分特别感兴趣。
考虑以下代码片段:
class Base
{
public:
virtual void Fun() = 0;
};
class Derived : public Base
{
public:
~Derived()
{
cout << "Derived::~Derived\n";
}
void Fun()
{
cout << "Derived::Fun\n";
}
};
int main()
{
shared_ptr<Base> pB = make_shared<Derived>();
pB->Fun();
}
在这种情况下,正如本文的作者所解释的,我们通过使用共享指针来实现多态删除,并且确实可以实现。
但是,如果我更换shared_ptr
了unique_ptr
,我不再能够观察到多态删除。
现在我的问题是,为什么这两种行为不同?为什么shared_ptr
要照顾多态删除unique_ptr
却不照顾呢?
您在这里有答案:https : //stackoverflow.com/a/22861890/2007142
引用:
一旦最后一个引用
shared_ptr
超出范围或被重置,~Derived()
将被调用并释放内存。因此,您无需进行~Base()
虚拟化。unique_ptr<Base>
并且make_unique<Derived>
不提供此功能,因为它们没有提供shared_ptr
针对删除程序的机制,因为唯一指针要简单得多并且目标是最低的开销,因此不存储删除程序所需的额外功能指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句