2014-12-04 90 views
-3

C++智能指針:如果在一個類中,我定義了一個指向智能指針的指針,這是否消除了智能指針的優點? (請注意,我沒有說我要申請這種用法)如果我定義一個指向智能指針的指針,這是否消除了智能指針的優點?

像:

class TestClass 
{ 
    public SmartPt* ptr1; 
} 

這裏SmartPt是智能指針類。

因爲如果我沒有很好地管理指針,指向的智能指針也不會被管理。

那麼這是否意味着使用指向智能指針的指針不是一個好習慣? 因此,最好是直接使用智能指針,如:

public SmartPt object1; 

[更新1]爲了不分散讀者,以前我用MySmartPt,在這裏我SmartPt更換。

+3

你可以發表你如何「定義指針指向智能指針」代碼? – Eric 2014-12-04 23:27:42

+1

可能會出現一些需要指向智能指針的情況,但我很難想到一個現實的應用程序。你可以向我們展示一些你認爲使用這種指針的代碼嗎? – 5gon12eder 2014-12-04 23:29:42

+0

@ 5gon12eder,不,我並不特意使用它。我只看到代碼,並認爲我可以修改它。 – user1914692 2014-12-04 23:41:05

回答

0

不,您不應該嘗試使用指向智能指針的指針,就像您要共享的示例一樣。

C++中的智能指針是圍繞RAII原則構建的,儘量避免使用*運算符。他們還使用複製/分配重載哪些原始指針不明白。

0

所以,如果你的意思是做這樣的事情:

void * vptr; 
int i = 1346; 

std::shared_ptr<int> sptr = std::make_shared<int>(i); 

vptr = &sptr; 

那麼,一旦超出範圍,因爲,這是它應該做的共享指針會刪除自身。智能指針不保留指向它們的指針的引用,只引用指向其數據的智能指針。

另外,如果你調用delete vptr;兩種情況之一發生會:

  1. 智能指針將是非常瘋狂的,它有刪除名爲。
  2. 如果智能指針超出範圍,則vptr指向一個無效的內存塊。