强制父对象的生存期
Enforce lifetime of parent object
考虑以下代码:
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 childThing = getParent().getChild(5)
是合理的。我该如何防止这种情况发生?是否有一种模式可以强制保留Parent
的实例?如果可能的话,我不想复制objects
,因为它的内容非常复杂。
让孩子成为父母的一员将有助于确保这一点(特别是如果你不分发对孩子的引用并将其保存在其他地方(。原理很简单:子对象是在父对象内部构造的,在父对象被构造之前不会被破坏
至于复制对象,您可以随时分发引用或指针。那里没有相当大的复制惩罚。
按照其他顺序,迭代器(就像你孩子的迭代器一样(一旦容器的内容发生变化,就很容易失效,所以我会对它们保持警惕。
编辑:在你的评论之后,你可以尝试使用shared_ptr来引用你的父对象。这些会让父母活着,至少还有一个孩子在身边。std::shared_ptr是引用计数的,与常规的非托管指针相比开销较小。例如,您可以将父对象创建为std::shared_ptr的实例,然后将此指针复制到子对象上。一旦所有子项和父项本身超出范围,父项将被删除。
相关文章:
- 在不复制临时对象的情况下延长其生存期
- 结束另一个线程中使用的对象的生存期
- "this"指针的值在对象的生存期内是否恒定?
- 数组对象的生存期是否在重用其元素存储时结束?
- 具有空洞初始化的对象的生存期
- 如何在向量列表初始化时避免对象复制以及如何延长临时的生存期
- 子表达式中临时对象的生存期
- 对临时对象的Const引用不会延长其生存期
- 对象存在与对象生存期不同吗
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- "std::function"的简单版本:函数对象的生存期?
- 有什么方法可以延长C++中临时对象的生存期吗
- 以延长构造函数外部 QT 对象的生存期
- QML QQmlPropertyList - 包含的对象生存期和'memory rules'
- 在函数调用中C++临时对象的生存期
- std::tie 和元组中返回的对象的生存期
- 是否存在对象存储在其生存期内可能会更改的情况?
- 从“if constexpr”分支扩展对象生存期/范围
- 在函数调用中创建的对象的生存期
- thread_local 和 std::future 对象 - 对象的生存期是多少