boost :: bind和delete

时间:2011-11-10 13:09:46

标签: c++ boost bind

我需要将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 个答案:

答案 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 表达式之外,无法调用构造函数;你不能忘记以这种或那种方式调用析构函数。