2013-10-09 45 views
1

我正在使用C++ std :: shared_ptr,並想知道除了重寫刪除ptr之外是否還有其他用於自定義刪除器的用法。或者,建議爲shared_ptr提供自定義delter的場景是什麼何時使用std :: shared_ptr自定義刪除器

+0

它通常與返回不透明的指針或其他需要特殊刪除功能的庫使用。 – user2802841

回答

1

您不一定需要明確說出刪除者。但該課程需要具備允許進行各種類型刪除的功能,例如從任何unique_ptr<T, D>構建shared_ptr<T>,以及從任何shared_ptr<T>構建shared_ptr<void>。當您第一次創建對象時,默認的刪除器就在那裏,並且它們會在所有這些轉換中傳播。

而且有時您可以使用其他種類的resource management的自定義刪除程序,但大多數情況下,unique_ptr對於這些情況可能更合適和充分。

0

據我所知,刪除者有兩個目標。

  1. 給你一個方法來覆蓋delete ptr;(如你所說)。
  2. 無法將shared_ptr和unique_ptr用於前向聲明類。
+0

您不需要定製刪除器來使用'shared_ptr'類型不完整的類型,只需要在首次初始化'shared_ptr'時完成類型(通常是這樣,因爲您剛分配了該對象點,所以類型必須完整) –

1

當您需要delete時,您需要自定義刪除程序。考慮不同的場景:

您從池中獲取內存並使用放置new來創建對象。在未用new創建的對象上調用delete將是未定義的行爲,因此您需要插入一個將使用適當內存池的刪除器。這適用於採用malloc獲取的存儲器,以及free或其他任何類型的存儲器分配器。這也適用於從不同的堆中獲取的內存。

該資源根本不是內存,而是文件描述符,數據庫連接等。刪除程序需要在沒有對該資源的引用時釋放資源,但釋放該資源不涉及調用delete,但一些其他操作。

4

不是所有的存儲器都分配有new,並且存儲器不是唯一需要發佈的資源,例如,像`美孚* CreateFoo()`/`無效DeleteFoo(美孚*)` -

std::shared_ptr<FILE> open_file(const std::String& path, const std::String& mode) 
{ 
    if (FILE* f = :fopen(path.c_str(), mode.c_str())) 
    return std::shared_ptr<FILE>(f, ::fclose); 
    throw std::runtime_error("Cannot open file"); 
} 
相關問題