为什么clang 3.4以如此奇怪的方式实现`std :: function`?

时间:2014-07-09 01:41:56

标签: c++ function c++11 functor

以下代码摘自clang 3.4的最新libc++标题<functional>

第1636行:

typedef __allocator_destructor<_Ap> _Dp;
unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
::new (__hold.get()) _FF(_VSTD::move(__f), _Alloc(__a));
__f_ = __hold.release();

为什么使用unique_ptr来管理动态分配的存储?请注意__hold永远不会调用deleter,因为它最终会释放对其内部存储的控制权!

为什么不写下如下:

__f_ = __a.allocate(1);
::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a));

1 个答案:

答案 0 :(得分:2)

__f_ = __a.allocate(1);

好的,你已经分配了内存并存储了指针。

::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a));

抛出异常,堆栈展开。哎呀,你刚刚泄露了你的动态记忆!防止内存泄漏的显而易见的方法是...... std::unique_ptr