如果我需要多态性,我应该使用原始指针而不是unique_ptr

If I need polymorphism should I use raw pointers instead of unique_ptr?

本文关键字:指针 unique ptr 原始 多态性 我应该 如果      更新时间:2023-10-16

如果我需要多态性,我应该使用原始指针而不是unique_ptr吗?

我看到一些线程显示了如何使用unique_ptr进行多态行为。我不确定这是否值得麻烦,我宁愿留在原始指针上。您能否对此发表评论,您在这种情况下对原始指针与智能指针的看法?

下面的简单代码表明,从多态性的角度来看,std::unique_ptr工作得很好,打印"Hello from Derived."

#include <iostream>
#include <memory>
using std::cout;
struct Base 
{
    virtual ~Base() { }
    virtual void SayHello()
    {
        cout << "Hello from Base.n";
    }
};
struct Derived : public Base
{
    void SayHello() override
    {
        cout << "Hello from Derived.n";
    }
};
int main()
{
    std::unique_ptr<Base> pBase( new Derived() );
    
    // Or using std::make_unique:
    //
    // std::unique_ptr<Base> pBase = std::make_unique<Derived>();      
    
    pBase->SayHello();
}

无论如何,观察原始指针是可以的;你必须注意的是拥有原始指针。拥有原始指针应安全地包装在 RAII 边界内(使用 unique_ptrshared_ptr 或某些自定义资源管理器)。

  • 使用 unique_ptr 来控制已分配资源的所有权,例如在函数内的免费存储上分配并返回unique_ptr

  • 如果所有权不是问题,则仅使用多态行为的引用。即使unique_ptr执行相同的操作,也可以使编译器免于额外的工作。

  • 如果所有权不是问题,请使用指针进行容器内的多态行为。不能有引用容器。

智能指针是关于所有权/生命周期的。 如果需要管理多态对象的生存期,请使用智能指针。 如果您只是使用该对象,则更喜欢原始引用/指针(按此顺序)而不是智能指针。