【问题标题】:C++17 unique_ptr lambda capture by value is ok, but not by referenceC ++ 17 unique_ptr lambda按值捕获可以,但不能按引用
【发布时间】:2021-09-24 21:29:03
【问题描述】:

我做了一个程序,显示按值传递没问题,但按引用传递会触发 SEGMENT FAULT。

目前unique_ptr的maker函数有new_unique_ptrnew_unique_ptr2两个如下

#include <functional>
#include <memory>

using namespace std;

template <class T, class Deleter>
unique_ptr<T, function<void(T *)>> new_unique_ptr(T *ptr, Deleter d) {
  return unique_ptr<T, function<void(T *)>>(ptr, [&](auto v) {
    if (v) {
      d(v);
    }
  });
}

template <class T, class Deleter>
unique_ptr<T, function<void(T *)>> new_unique_ptr2(T *ptr, Deleter d) {
  return unique_ptr<T, function<void(T *)>>(ptr, [=](auto v) {
    if (v) {
      d(v);
    }
  });
}

void free_int(int *v) { delete v; }

int main() {
  printf("0: %p\n", free_int);

  {
    printf("\n--- demo1 ---\n");

    auto v2 = new_unique_ptr2(new int(2), free_int);
    printf("value is %d\n", *v2);
  }

  {
    printf("\n--- demo2 ---\n");
    auto v = new_unique_ptr(new int(1), free_int);

    printf("value is %d\n", *v);
  }

  return 0;
}

编译运行

g++ main.cc

./a.out

将示例输出显示为

0: 0x7f99c7efe209

--- demo1 ---
11: 0x7f99c7efe209
value is 2
22: 0x7f99c7efe209

--- demo2 ---
1: 0x7f99c7efe209
value is 1
2: 0x7fff3e5ae7e0
Segmentation fault (core dumped)

表示通过引用传递的demo (demo2) 失败。

如果有人能帮忙解释一下原因,真的很感激~

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    new_unique_ptr 中,lambda 正在通过引用捕获函数参数dd 将在new_unique_ptr 返回时被销毁,使捕获的引用悬空。之后,当 std::unique_ptr 被销毁时,删除器会在导致 UB 的悬空引用上调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 2014-02-21
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      相关资源
      最近更新 更多