微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++17 unique_ptr lambda 按值捕获是可以的,但不能按引用

如何解决C++17 unique_ptr lambda 按值捕获是可以的,但不能按引用

我制作了一个程序,显示按值传递没问题,但按引用传递会触发 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,function<void(T *)>> new_unique_ptr2(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)

表示通过引用演示(demo2)失败。

如果有人可以帮助解释原因真的很感激~

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。