问题描述
我制作了一个程序,显示按值传递没问题,但按引用传递会触发 SEGMENT FAULT。
目前有两个unique_ptr
maker函数,分别是new_unique_ptr
和new_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 正在通过引用捕获函数参数 d
; d
将在 new_unique_ptr
返回时销毁,使捕获的引用悬空。之后,当 std::unique_ptr
被销毁时,会在导致 UB 的悬空引用上调用删除器。