我正在阅读TensorFlow教程,在深入研究代码时我遇到了这个:
players[i].combination[ANONYMOUS ARRAY.length] = some value;
Register函数声明如下:
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;
}
以上代码段似乎是使用void OpRegistry::Register(std::function<OpDef(void)> func);
OpDefBuilder*
对象
然后它在作为参数传递给OpDefBuilder* b = new OpDefBuilder(name);
的lambda函数中用delete b;
销毁该对象。然后它返回相同的对象(!)。假设lambda函数在OpRegistry::Global()->Register(...)
内被调用(并且它根据我的理解被调用),这对我来说没有意义。
我不是C ++初学者,但我以前从未见过这种练习。我在这里缺少什么?
完整的.cpp文件(包括Register(...)
定义)为{{3}}
非常感谢您的帮助。
答案 0 :(得分:1)
OpDef
的构造函数将initialized
成员设置为false
。但是,传递给Register
的函数对象仅在此成员为true
时调用。也就是说,注册不会调用对象的函数{{1}。
据说,该函数稍后执行,此时对象被清理。这个方面对我来说看起来有些问题,但没有深入挖掘,似乎没有明显的错误。
答案 1 :(得分:0)
如果没有Register
的代码,很难说,但很可能它不会立即执行传递给它的lambda。它可能存储它以便稍后执行,作为某种清理。
答案 2 :(得分:0)
我大约90%的人确信这是一个真正的错误。我在一些对op注册表更了解的人的帮助下深入挖掘它。将更新。
(我相信发生的事情是,在每次使用注册表时,initialized_
都是错误的 - 即,在注册表上执行任何查找或其他操作之前,操作都已注册。这条路径显然是正确的,因为op被抛入延迟队列,因此删除直到稍后才会生效。但是,如果稍后注册了op,它就像一个bug。这就是我正在检查的内容。试图创建一个测试用例。)