2014-02-28 52 views
4

如果我需要多態性,我應該使用原始指針而不是unique_ptr如果我需要多態性,我應該使用原始指針而不是unique_ptr?

我看到一些線程顯示如何使用unique_ptr多態行爲。 我不確定這是否值得麻煩,我寧願留在原始指針。 您可以對此評論一下,您對這方面的原始指針與智能指針的看法?

+1

不要使用非專用的原始指針。基本上,它們不可能正確使用。 –

+0

這是一個很好的觀點。在我的情況下,我可以保持私密。 – user3111311

+0

你可以指向這些線程嗎? AFAIK在原始指針或'unique_pointer'或'shared_pointer' wrt多態性之間沒有區別。他們都以同樣的方式工作。 – balki

回答

1

智能指針是關於所有權/生命週期。如果需要管理多態對象的生命週期,請使用智能指針。如果您只是使用該對象,則優先使用智能指針上的原始引用/指針(按此順序)。

1
  • 使用unique_ptr來控制分配資源的所有權,例如,在一個函數內部的免費商店中分配並返回一個unique_ptr

  • 如果所有權不是問題,那麼只使用多態行爲的參考。即使unique_ptr也是如此,您可以免除編譯器的額外工作。

  • 如果所有權不是問題,請使用容器內多態行爲的指針。你不能有一個引用的容器。

9

下面的簡單代碼顯示std::unique_ptr作品從一個多態性點就好了,印刷"Hello from Derived"

#include <iostream> 
#include <memory> 
using namespace std; 

struct Base 
{ 
    virtual ~Base() { } 

    virtual void SayHello() 
    { 
     cout << "Hello from Base." << endl; 
    } 
}; 

struct Derived : public Base 
{ 
    void SayHello() override 
    { 
     cout << "Hello from Derived." << endl; 
    } 
}; 

int main() 
{ 
    unique_ptr<Base> pBase(new Derived());  
    pBase->SayHello(); 
} 

反正觀察原始指針是細;你必須注意的是擁有原始指針。擁有原始指針應安全地包裹在RAII邊界內(使用unique_ptr,shared_ptr或某些自定義資源管理器)。

相關問題