c++ - 强制执行父对象的生命周期

标签 c++ object-lifetime

考虑以下代码:

class Child {
   vector<Object>::iterator it;
}

class Parent {
   vector<Object> objects;

   Child getChild(int idx) {
       Child ret;
       ret.it = objects.begin() + idx;
       return ret;
   }
}

显然, child 不能比其 parent 长寿,但我希望尝试调用类似 Child childThing = getParent().getChild(5) 的方法是合理的。我怎样才能防止这种情况发生?是否有一种模式可以强制保留 Parent 的实例?如果可能的话,我不想复制 objects,因为它的内容非常复杂。

最佳答案

将 child 作为 parent 的一员可以帮助您确保这一点(特别是如果您不分发对 child 的引用并将它们保存在其他地方)。原理很简单:子级在父级内部构造,只有在父级构造完成后才会被销毁。

至于复制对象,你总是可以分发引用或指针。那里没有相当大的复制惩罚。

在其他顺序中,一旦容器的内容发生变化,迭代器(如您的 child 所拥有的迭代器)很容易失效,因此我会对这些保持警惕。

编辑:发表评论后,您可以尝试使用 shared_ptr 来引用您的父对象。这些将使 parent 活着,而至少有一个 child 和他们在一起。 std::shared_ptr 是引用计数的,并且比常规的非托管指针具有较小的开销。例如,您可以将父对象的实例创建为 std::shared_ptr,然后将此指针复制到子对象上。一旦所有子项和父项本身超出范围,父项将被删除。

关于c++ - 强制执行父对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469054/

相关文章:

c++ - 用于将多个.cpp 和.h 编译成一个lib 的Makefile

c++ - 绑定(bind)到引用时临时对象生命周期扩展异常的基本原理是什么?

garbage-collection - 在 GC 语言中是否有关于(或更好地使用)RAII 的研究?

c++ - 全局 bool 变量在全局销毁期间是否可靠?

rust - 如果外部包装箱明确要求静态生命周期,该怎么办?

c++ - 为什么 (i|o)fstream 使用 const char* 参数作为文件名?

c++ - 为什么我可以将接受值的可调用对象传递给接受引用的 std::function?

c++ - 通过 Lambda 删除 vector 项

C++ fstream - 仅读取某些变量类型的问题

c++ - 使用基类引用而不是指针时出现意外的虚函数分派(dispatch)