gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:21:55 24 4
gpt4 key购买 nike

我制作了一个程序,显示按值传递很好,但按引用传递会触发段故障。
目前,有两个unique_ptr制造商功能为 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)
这表明通过引用演示( demo2 )失败。
如果有人可以帮助解释原因,真的很感激~

最佳答案

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

关于C++17 unique_ptr lambda 按值捕获是可以的,但不能按引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68402850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com