C++确保在执行函数时对象存在



我有一个函数foo。在执行foo的过程中,我想确定Bar类型的对象是否存在。让我们将任何碰巧是"bar"的对象称为

我不能复制或移动barbar可以有任何存储持续时间。关于bar,我知道的一件事是它是一个空对象。

foo不需要对bar做任何事情或了解它

  • 首先要考虑的是,将一个Bar&传递到foo中,告诉调用环境,"嘿,当我运行时,你需要确保bar存在!">但是调用环境可以将一个悬空引用传递到foo中,在这种情况下,bar将在foo运行之前被销毁。

  • 第二个想法是,在中传递一个shared_ptrbar。但是(如果我错了,请纠正我(这需要bar具有动态存储持续时间。

  • 第三个想法是,编写一个可复制和可移动的辅助类型,以保证bar的存在。但这感觉就像是在重新发明shared_ptr车轮。

我有哪些选项可以确保barfoo期间存在,它们的优势和局限性是什么?

调用环境可以将悬空引用传递到foo

真的不行。挂起引用是不合法的,所以发生这种情况的唯一方法是调用方违反语言规则。我觉得这不是一个令人信服的问题。

将shared_ptr传递给bar。但这需要bar具有动态存储持续时间。

不完全是。shared_ptr可以用自定义的deleter来构造,因此如果调用者想要传入一个";堆栈分配";Bar,它们可以构造一个带有不删除任何内容的deleter的shared_ptr。

bar是一个空对象

那么整个练习的意义是什么?是因为Bar构造函数和/或析构函数有副作用,必须在foo运行之前/之后发生吗?如果是这样的话,也许foo应该自己做这些事情,或者可以创建foo_wrapper函数来隐藏这些细节。

相关内容

  • 没有找到相关文章

最新更新