повысить :: связать и удалить - PullRequest
3 голосов
/ 10 ноября 2011

Мне нужно сопоставить delete ptrAddr; с boost::function0, но у меня есть некоторые проблемы, связанные с удалением. бесплатно работает просто отлично. Кажется, проблема в std::ptr_fun(operator 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

Ответы [ 2 ]

11 голосов
/ 10 ноября 2011

Вы можете использовать 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);

Или просто лямбда:

[new_string]() { delete new_string; }
4 голосов
/ 10 ноября 2011

delete p; не является вызовом функции;это выражение .То, что вы хотите, не имеет смысла.

Существует свободная функция ::operator delete(), но она не делает то, что вы думаете.

Посмотрите на реализацию любого стандартного контейнера библиотеки(ключевое слово: allocator) или, возможно, 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 выражения ;и вы не должны забывать вызывать деструктор так или иначе.

...