2013-08-25 33 views
2

我正在寫C++,但我有一些與RAII的問題。shared_ptr與自定義刪除和分配器

我想建立一個自定義的類,使用指向結構的指針作爲私有成員。

struct mystruct; 
typedef struct mystruct mystruct_t; 

class container 
{ 
public: 
    container(); 
private: 
    shared_ptr<mystruct_t> data; 
    mystruct* init(); 
    void destroy(mystruct*); 
}; 

在類的構造函數中我想構造智能指針傳遞它的分配器和析構函數方法。這兩種方法來自一個庫(它們在分配內存之後準備結構),我無法修改它們。所以我想把它們包裝在兩個類的方法中(我稱它們爲init和destroy)。

我以爲的shared_ptr的代表構造成這個樣子了

container() 
: data(nullptr, std::bind(&container::destroy), std::bind(&container::init)) 
{} 

,但它不工作。 有什麼想法?謝謝!

+2

你不需要在C++' – 0x499602D2

+2

Euhm中使用'typedef struct',實際上這個結構來自一個我必須包裝的c庫。我試圖總結所有涉及的代碼更清晰。 我已經知道這一點,但謝謝! :) – user2714602

回答

4

假設您的destroy()init()方法不是static成員,他們首先需要一個對象來處理,其次他們可能需要一些參數。也就是說,我預計bind()表情看起來更像

data(nullptr, 
    std::bind(&container::destroy, some_container, _1), 
    std::bind(&container::init, some_container)) 

不過,我懷疑你將有很多的樂趣與分配器:你很可能會是設置std::shared_ptr<mystruct>最初是默認的最好關閉構建和分配資源構建一旦你得到了它抱:

this->data = std::shared_ptr<mystruct>(container->init(), 
             std::bind(&container::destroy, container, _1)); 

的第三個參數爲std::shared_ptr<T>的構造是一個分配器和他們比只是一些辦理施工對象的更復雜的野獸。

+0

我想通過而不是nullptr的init()方法的結果,然後只是刪除功能。但我喜歡優雅的東西,我想處理分配器:) 有些鏈接可以傳遞給我?這是三個小時我尋找網絡上的東西。 – user2714602

+0

@ user2714602:分配器做了很多事情,並且創建對象的接口不適合!雖然我可以想象,你可以讓分配器做正確的事情(在這種情況下,它也會考慮釋放,順便說一句),我不會沿着這條路線去創建現成的對象。 –

相關問題