以下代码摘自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));
答案 0 :(得分:2)
__f_ = __a.allocate(1);
好的,你已经分配了内存并存储了指针。
::new (__f_) _FF(_VSTD::move(__f), _Alloc(__a));
抛出异常,堆栈展开。哎呀,你刚刚泄露了你的动态记忆!防止内存泄漏的显而易见的方法是...... std::unique_ptr
。