C++ boost::绑定和删除

C++ boost::绑定和删除,c++,boost,bind,C++,Boost,Bind,我需要映射一个删除ptrAddr到一个boost::function0但是我在删除时遇到了一些麻烦。免费工作很好。问题似乎是std::ptr_-fun(操作符删除),但我不知道如何在不编写助手函子的情况下实现这一点 boost::function0<void> Function; Function = boost::bind(std::ptr_fun(free), (void*)malloc_string); //this works Function = boost::bind(

我需要映射一个
删除ptrAddr到一个
boost::function0
但是我在删除时遇到了一些麻烦。免费工作很好。问题似乎是
std::ptr_-fun(操作符删除)
,但我不知道如何在不编写助手函子的情况下实现这一点

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
boost::function0函数;
函数=boost::bind(std::ptr\u fun(free),(void*)malloc\u字符串)//这很有效
函数=boost::bind(std::ptr_-fun(运算符删除),(void*)新字符串)//不起作用
函数()//调用函数

删除p
不是函数调用;这是一个表达式。你想要的没有意义

确实存在一个免费函数
::operator delete()
,但这并不是你所想的

查看任何标准库容器(关键字:分配器)的实现,或者查看如何处理可自定义的对象删除


典型的施工/破坏顺序分解为以下几部分:

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

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

p->~T();                                  // destruction

::operator delete(addr);                  // deallocation
第一步到第二步在道德上等同于表达
T*p=newt,而最后一个对应于
删除p。但是,除了通过
new
表达式之外,没有其他方法可以调用构造函数;而且千万别忘了以这种或那种方式调用析构函数。

您可以从Boost使用。Lambda:

boost::bind(boost::delete_ptr(), new_string);
在C++11中,可以使用
std::default\u delete


在处理用户定义的类型时,有一个隐藏的指针。在删除分配的内存之前,它还会调用析构函数。不要将new/delete与malloc/free混用,我应该通过
new\u ptr
进行分配,以便使用
delete\u ptr
?@cprogrammer:No,
new\u ptr
定义为使用
new t(args)
,而
delete\u ptr
定义为使用
delete t
,因为,否则没有多大意义。知道我为什么会收到bind.hpp(69):错误C2039:“结果类型”:不是“boost::lambda::delete_ptr”的成员吗?我使用的是boost/bind而不是boost/lambda/bind。谢谢猫
std::bind(std::default_delete<decltype(new_string)>(), new_string);
[new_string]() { delete new_string; }