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; }