2015-05-20 35 views
0

我有了一個指針作爲成員的struct所有權計數:我如何才能增加的std ::共享指針

struct MyStruct { 
    char *ptr; 
} 

我想初始化的範圍PTR,然後可以在室外使用的範圍:

{ // scope 0 
    { //scope 1 

     { // scope 2 
      mystruct.ptr = new char[100]; 
     } 

     // mystruct.ptr still lives here 
    } 

    // i dont need mystruct anymore 
    delete[] mystruct.ptr; 
} 

但後來我不得不刪除它,這是容易出錯,我寧願避免這樣做。所以我想用std::shared_ptr

{ // scope 0 
    { //scope 1 

     { // scope 2 
      auto a = std::make_shared<char>(new char[100]); 
      mystruct.ptr = a.get(); // ??????? HOW TO ASSIGN 
     } 

     // mystruct.ptr still SHOULD live here 
    } 
} 
  • 所以,我怎麼能這樣做呢?我應該如何將shared_ptr分配給mystruct.ptr以使所有權計數變爲2?我看到get()不起作用,因爲它只是傳遞指針,但不能提供所有權,所以它被刪除。

  • 正如你所看到的,這裏的主要動機是延長壽命,所以我願意接受其他實踐。也許我錯在想在這裏使用shared_ptr?

+1

通過設置一個共享指針(或唯一指針,除非您特別需要共享所有權),您將「擴展所有權」爲「mystruct.ptr」。這就是共享指針的工作原理。無法從原始指針獲取自動所有權語義。 –

+0

我無法修改mystruct。因此,對於原始指針,我必須使用新的刪除? –

+1

是的。這就是爲什麼你不應該使用原始指針來表示動態資源的所有權。如果你出於某種原因無法修復它,那麼你必須自己仔細刪除它。或者安排別的東西來擁有它,並像邪惡的指針一樣長存。 –

回答

3

有增加其分配到其他的std :: shared_ptr的實例旁邊一個std的所有權櫃檯:: shared_ptr的不合法的方式。無論如何,它無法解決你的問題。在你的情況下,你必須照顧適當的新/ malloc和釋放/刪除你使用過的內存。如果你操縱一個share_ptr,你必須注意你也要減少它,否則你的內存泄漏。情況也是如此。

  • 如果您可以控制結構體MyStruct,請將其更改爲std :: string或std :: shared_ptr。如果沒有,堅持新/刪除恕我直言。這至少是可讀和誠實的。
  • 如果您可以控制範圍0區域,請在那裏使用std :: unique_ptr。這是有道理的,因爲你不必處理例外情況。如果您不知道需要的尺寸,請堅持新的/刪除。
+0

*沒有合法的方法來增加所有權計數器*幸運的是:-)否則:誰會關心減少它?它看起來很像'std :: string'的情況。 – Wolf

+0

這將是一種(不存在)std :: manual_ptr,其中開發人員必須增加和減少計數器。我在Objective C和MS COM中看到了這一點。它不可靠,因爲開發人員可以忘記釋放命令,因爲他們可以忘記釋放內存。 –

+0

我曾想過,當mystruct超出範圍時,會自動將其所有權下放到ptr。但是現在我看到,由於它是一個原始指針,我仍然需要維護它,所以最好使用delete。 –