我需要将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
答案 0 :(得分:11)
您可以使用Boost.Lambda中的delete_ptr
:
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; }
答案 1 :(得分:4)
delete p;
不是函数调用;它是表达式。你想要的东西没有意义。
确实存在免费功能::operator delete()
,但这并不符合您的想法。
查看任何标准库容器(keyword: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
表达式之外,无法调用构造函数;你不能忘记以这种或那种方式调用析构函数。