2013-03-13 117 views
9

我有一個通用類myClass有時需要存儲額外的狀態信息,具體取決於用途。這通常使用void*完成,但我想知道是否可以使用std::unique_ptr<void, void(*)(void*)>,以便在類實例被破壞時自動釋放內存。問題是,我需要使用自定義刪除程序來刪除void *,導致未定義的行爲。使用std :: unique_ptr <void>與作爲智能無效的定製刪除器*

有沒有辦法默認構造一個std::unique_ptr<void, void(*)(void*)>,所以我沒有構造它首先與一個虛擬刪除器然後設置一個真正的刪除器當我使用void*狀態結構?或者有更好的方法來存儲一個班級的狀態信息?

下面是一些示例代碼:

void dummy_deleter(void*) { } 

class myClass 
{ 
public: 
    myClass() : m_extraData(nullptr, &dummy_deleter) { } 
    // Other functions and members 
private: 
    std::unique_ptr<void, void(*)(void*)> m_extraData; 
}; 
+7

當我們有模板時,'void'指針確實沒有多大用處。 – 2013-03-13 12:04:11

+3

這聽起來像是[xy問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – Pubby 2013-03-13 12:06:37

+0

您確定要在這裏使用'unique_ptr',而不是'shared_ptr'嗎? – 2013-03-13 12:12:43

回答

6

可能存儲額外的信息,將有一個虛析構函數的接口IAdditionalData更直觀的方式。 無論您可能擁有哪些數據結構,都會從IAdditionalData繼承並存儲在std::unique_ptr<IAdditionalData>中。

這也提供了更多的類型安全性,因爲您將在IAdditionalData和實際類型之間進行靜態轉換,而不是在void *和任何數據類型之間reinterpret_cast。

+0

您也可以在void *和目標類型之間進行static_cast。 – 2013-03-13 12:12:24

+0

@ R.MartinhoFernandes您可以在void *和任何類型之間調用static_cast。它不提供類型安全保證。與界面相反。 – 2013-03-13 12:13:28

+0

從IAdditionalData到SomeDerivedAdditionalData的static_cast並沒有比void *更安全的SomeDerivedAdditionalData,但(至少不是以任何重要的方式)。 – 2013-03-13 12:22:53

相關問題