C++-在返回对象之前删除对象
C++ - Deleting an object before returning it
我正在学习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正在检查并尝试为创建测试用例。)
- 线程调用的函数对对象删除是否安全?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 使用 com 对象删除计划任务
- C 将对象删除为参考
- C样式对象删除的包装器
- 静态映射中动态分配的对象.删除必要的
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- Python 对象删除检测
- C++安全对象删除
- Qt:RemoveWidget和对象删除
- Qt对象删除导致崩溃
- 删除由两个shared_pointer实例管理的对象(删除其中一个)
- 顶点缓冲区对象(删除进程)opengl
- 设计 -- 按名称或对象删除
- 提升中的异常:进程间,共享内存对象删除
- 使用std::function和std::bind来存储回调并处理对象删除
- 如何使用智能指针防止双重对象删除
- 指针指向对象删除时自动为空
- 对象层次结构中的对象删除责任