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

C++ - Deleting an object before returning it

本文关键字:对象 删除 C++- 返回      更新时间:2023-10-16

我正在学习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);

上面的片段似乎正在创建一个具有OpDefBuilder* b = new OpDefBuilder(name);OpDefBuilder*对象

然后,它在作为参数传递给OpRegistry::Global()->Register(...)的lambda函数中用delete b;销毁该对象。然后它返回相同的对象(!)。假设lambda函数在Register(...)中被调用(根据我的理解,它确实被调用了),这对我来说没有意义

我不是C++初学者,但我以前从未见过这种练习。我在这里错过了什么?

完整的.cpp文件(包括Register(...)定义)在这里是

我们将非常感谢你的帮助。

OpDef的构造函数将initialized成员设置为false。但是,传递给Register的函数对象只有在该成员为true时才被调用。也就是说,注册不调用对象的函数delete

据推测,函数将在稍后执行,此时对象将被清理。这个粒子在我看来有点可疑,但如果不深入挖掘,似乎不会有明显的错误。

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

我大约90%确信这是一个实际的bug。我正在一些对操作注册表更了解的人的帮助下深入研究。将更新。

(我相信现在的情况是,在每次使用注册表时,initialized_都是错误的——也就是说,在对注册表执行任何查找或其他操作之前,操作都已注册。这个路径显然是正确的,因为操作被放入延迟队列,所以删除要到稍后才会生效。然而,如果稍后注册操作,它闻起来像个bug正在检查并尝试为创建测试用例。)