C ++ - 在返回对象之前删除它

时间:2015-12-12 19:12:28

标签: c++ tensorflow

我正在阅读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}}

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

OpDef的构造函数将initialized成员设置为false。但是,传递给Register的函数对象仅在此成员为true时调用。也就是说,注册不会调用对象的函数{{1}。

据说,该函数稍后执行,此时对象被清理。这个方面对我来说看起来有些问题,但没有深入挖掘,似乎没有明显的错误。

答案 1 :(得分:0)

如果没有Register的代码,很难说,但很可能它不会立即执行传递给它的lambda。它可能存储它以便稍后执行,作为某种清理。

答案 2 :(得分:0)

我大约90%的人确信这是一个真正的错误。我在一些对op注册表更了解的人的帮助下深入挖掘它。将更新。

(我相信发生的事情是,在每次使用注册表时,initialized_都是错误的 - 即,在注册表上执行任何查找或其他操作之前,操作都已注册。这条路径显然是正确的,因为op被抛入延迟队列,因此删除直到稍后才会生效。但是,如果稍后注册了op,它就像一个bug。这就是我正在检查的内容。试图创建一个测试用例。)