我正在使用C++ std :: shared_ptr,並想知道除了重寫刪除ptr之外是否還有其他用於自定義刪除器的用法。或者,建議爲shared_ptr提供自定義delter的場景是什麼何時使用std :: shared_ptr自定義刪除器
回答
您不一定需要明確說出刪除者。但該課程需要具備允許進行各種類型刪除的功能,例如從任何unique_ptr<T, D>
構建shared_ptr<T>
,以及從任何shared_ptr<T>
構建shared_ptr<void>
。當您第一次創建對象時,默認的刪除器就在那裏,並且它們會在所有這些轉換中傳播。
而且有時您可以使用其他種類的resource management的自定義刪除程序,但大多數情況下,unique_ptr
對於這些情況可能更合適和充分。
據我所知,刪除者有兩個目標。
- 給你一個方法來覆蓋
delete ptr;
(如你所說)。 - 無法將shared_ptr和unique_ptr用於前向聲明類。
您不需要定製刪除器來使用'shared_ptr'類型不完整的類型,只需要在首次初始化'shared_ptr'時完成類型(通常是這樣,因爲您剛分配了該對象點,所以類型必須完整) –
當您需要delete
時,您需要自定義刪除程序。考慮不同的場景:
您從池中獲取內存並使用放置new來創建對象。在未用new
創建的對象上調用delete
將是未定義的行爲,因此您需要插入一個將使用適當內存池的刪除器。這適用於採用malloc
獲取的存儲器,以及free
或其他任何類型的存儲器分配器。這也適用於從不同的堆中獲取的內存。
該資源根本不是內存,而是文件描述符,數據庫連接等。刪除程序需要在沒有對該資源的引用時釋放資源,但釋放該資源不涉及調用delete
,但一些其他操作。
不是所有的存儲器都分配有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");
}
- 1. Boost shared_ptr:如何使用自定義刪除器和分配器
- 2. 使用定製刪除與std :: shared_ptr
- 3. 使用自定義刪除器中的shared_ptr
- 4. 使用shared_ptr與自定義刪除器進行HANDLE RAII兼容
- 5. shared_ptr奇怪的空值和自定義刪除器
- 6. C++ tr1 shared_ptr自定義分配器和刪除
- 7. 自定義刪除提升shared_ptr
- 8. 如何在std :: unique_ptr成員中使用自定義刪除器?
- 9. shared_ptr與自定義刪除和分配器
- 10. 自定義刪除shared_ptr的其他參數
- 11. std :: shared_ptrs的自定義刪除程序
- 12. std :: unique_ptr的自定義刪除規範
- 13. std :: unique_ptr <T[]>和自定義分配器刪除器
- 14. std :: unique_ptr使用自定義刪除與幾個參數
- 15. 的std ::的unique_ptr和自定義刪除器
- 16. std :: unique_ptr自定義模板刪除器不叫
- 17. std :: shared_ptr與std容器
- 18. 重新定義自定義刪除
- 19. 在std :: shared_ptr上使用.reset()刪除所有實例
- 20. 如何刪除自定義偵聽器?
- 21. std :: shared_ptr迭代器
- 22. 如何使用的std ::綁定的std :: shared_ptr的
- 23. 我如何使用box2d使用std :: shared_ptr?
- 24. SWIG:使用std :: map訪問器與shared_ptr?
- 25. shared_ptr商店刪除器如何?
- 26. shared_ptr <>到數組定製刪除器(使用make_shared)
- 27. shared_ptr賦值 - 是否也複製了定製刪除器?
- 28. 使用Boost Python&std :: shared_ptr
- 29. 使用std :: queue與shared_ptr?
- 30. 使用Qt中std :: shared_ptr的
它通常與返回不透明的指針或其他需要特殊刪除功能的庫使用。 – user2802841