2011-11-10 107 views
3

我需要映射一個delete ptrAddr;到一個boost::function0,但我有一些麻煩這樣做刪除。免費的作品就好了。這個問題似乎是std::ptr_fun(operator delete),但我不知道如何在沒有編寫助手函數的情況下完成這項工作。boost :: bind和delete

boost::function0<void> Function; 
Function = boost::bind(std::ptr_fun(free), (void*)malloc_string); //this works 
Function = boost::bind(std::ptr_fun(operator delete), (void*)new_string); //doesn't work 
Function(); //call function 
+0

有在處理用戶定義的類型時隱藏這個指針。它還會在刪除分配的內存之前調用析構函數。不要混用new/delete與malloc/free – sarat

回答

11

您可以使用delete_ptr從Boost.Lambda:

boost::bind(boost::delete_ptr(), new_string); 

在C++ 11,你可以用std::default_delete<T>

std::bind(std::default_delete<decltype(new_string)>(), new_string); 

或者只是一個lambda:

[new_string]() { delete new_string; } 
+2

+1來提及'std :: default_delete '。 –

+0

我應該通過'new_ptr'進行分配以便使用'delete_ptr'? – cprogrammer

+0

@cprogrammer:不,'new_ptr'被定義爲使用'new T(args)','delete_ptr'被定義爲使用'delete T',因爲如果不這樣做的話,它沒有什麼意義。 –

4

delete p;不是函數調用;這是一個表達式。你想要什麼沒有意義。

確實存在免費功能::operator delete(),但這並不符合您的想法。

看看任何標準庫容器(關鍵字:分配器)的實現,或者可能是std::unique_ptr,看看如何處理可自定義的對象刪除。


分解成碎片的典型結構/銷燬序列看起來像這樣:

void * addr = ::operator new(sizeof(T)); // allocation 

T * p = ::new (addr) T;     // construction 

p->~T();         // destruction 

::operator delete(addr);     // deallocation 

第一至步驟是道德上等同於表達T * p = new T;,而最後以對應於delete p;。儘管如此,除了通過new表達式之外,沒有辦法調用構造函數。你不能忘記以這種或那種方式調用析構函數。