【问题标题】:Why does clang 3.4 implement `std::function` in such a weird way?为什么 clang 3.4 以如此奇怪的方式实现 `std::function`?
【发布时间】:2014-07-09 01:41:56
【问题描述】:

以下代码摘自clang 3.4最新的libc++ header <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));

【问题讨论】:

  • @v.oddou,从概念上讲,分配器分配的所有存储都可以看作dynamically allocated storage
  • 异常安全原因?
  • @Bryan 是对的,如果构造函数抛出会发生什么?
  • 到底有什么奇怪的?唯一 ptr 是默认值。除非它是共享的,否则应该始终使用它来管理内存。
  • STL 的实现是否可读?

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


【解决方案1】:
__f_ = __a.allocate(1);

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

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

这会引发异常,并且堆栈会展开。糟糕,您刚刚泄露了动态内存!防止内存泄漏的明显方法是....std::unique_ptr.

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 2012-06-02
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多