【发布时间】:2015-12-12 19:12:27
【问题描述】:
我正在阅读 TensorFlow 教程,并在深入研究代码时遇到了以下问题:
OpDefBuilder& RegisterOp(StringPiece name) {
VLOG(1) << "RegisterOp: " << name;
OpDefBuilder* b = new OpDefBuilder(name);
OpRegistry::Global()->Register([b]() -> ::tensorflow::OpDef {
OpDef op_def;
TF_QCHECK_OK(b->Finalize(&op_def));
delete b;
return op_def;
});
return *b;
}
Register函数声明如下:
void OpRegistry::Register(std::function<OpDef(void)> func);
上面的 sn-p 似乎是在用OpDefBuilder* b = new OpDefBuilder(name); 创建一个OpDefBuilder* 对象
然后它在作为参数传递给OpRegistry::Global()->Register(...) 的 lambda 函数中使用delete b; 销毁该对象。然后它返回相同的对象(!)。假设 lambda 函数在 Register(...) 内被调用(并且根据我的理解确实被调用),这对我来说没有意义。
我不是 C++ 初学者,但我以前从未见过这种做法。我在这里错过了什么?
完整的 .cpp 文件(包括 Register(...) 定义)是 here
我们将不胜感激。
【问题讨论】:
-
如果返回
op_def,则行为未定义。您正在返回对局部变量的引用。可能这段代码几乎没有针对该场景进行过测试。 -
@up 他不是按值返回吗?
-> ::tensorflow::OpDef -
@Fireho - 是的,我错过了。返回的是 lambda,而不是整个函数。
-
什么是TF_QCHECK_OK(b->Finalize(&op_def));?这可能与场景有很大关系。
-
通常,当您向某人注册某事时,该某事会在稍后被调用,而不是当场调用。否则,该方法的正确名称不应该是
Register,而应该是其他名称。Register表示使用“观察者”设计模式,不是“访问者”设计模式。
标签: c++ tensorflow