- 主题:被 std::function 坑一回
嗯,缺省copyable的环境对move太不友好了。
更合理的缺省值,缺省movable, non-copyable,就成了rust。
【 在 milksea 的大作中提到: 】
: 用到回调函数,为了支持虚函数,不用模板类型参数表示回调函数,而用了 std::function 包装。结果用 lambda 表达式传参的时候,有 move 捕获变量就编译失败了。代码类似这样:
: void api(std::function<void()>&& callback)
: {
: ...................
--
FROM 58.37.58.*
不好。最后没调用lambda,就leak。拷贝lambda并且都调用了,就double free。
auto up = std::make_unique<std::string>("hello");
if (0) {
auto f = [p=up.release()]{std::unique_ptr<std::string> ap(p);};
// leak
} else {
auto f = [p=up.release()]{std::unique_ptr<std::string> ap(p);};
auto g = f;
f();
g(); // double free
}
【 在 ble 的大作中提到: 】
: 对unique_ptr不太清楚的时候,我一般会release出来而不是在让它在lambda中间传递
: auto up = std::make_unique<Foo>();
: call([p=up.release()](){std::unique_ptr<Foo> ap(p); ap->bar();})
--
FROM 58.37.58.*
你这样的functor一样是不可拷贝,和楼主最早写的并无差别。
有的functor就是不可拷贝,std::function不该要求可拷贝。
【 在 DoorWay 的大作中提到: 】
: 你这么一说,是不是写个functor就行了,结构体的构造函数接unique_ptr。
: 然后把unique _ptr脱了,自己在析构里释放。
--
FROM 58.37.58.*
当然可以,不过你怎么实现copy ctor?
【 在 DoorWay 的大作中提到: 】
: 我把入参的unique_ptr脱了壳,成员变量存裸指针,不行吗?
: 我明天试试。
--
FROM 58.37.58.*
可能当初functor的成员变量都是些常量(e.g. bind2nd(less<double>(), 1.0),没人想到functor还会拥有别的对象吧。
而且没有move的年代,容器怎么保存用户传入的functor?显然是copy。从stl开始functor习惯上就是copyable。
【 在 milksea 的大作中提到: 】
: 我没研究过,为什么folly可以不要求可拷贝而std要求,不知道有什么考虑还是std开始没想到。如果是现有版本std库缺陷,以后增加提案放宽std::function的构造需求应该是最优解。
--
修改:ilovecpp FROM 58.37.58.*
FROM 58.37.58.*
什么场景用到shared<unique>? 我们共同拥有一个对象,但我们任何一个人都可以把它偷走...
【 在 milksea 的大作中提到: 】
: 我看到stackoverflow里面还有用shared_ptr包一层unique_ptr的处理方法,我觉得很魔道…他这个思路无非解出来就这样了吧
--
FROM 58.37.58.*