C ++确保对象在执行函数时存在
C++ ensure object exists while executing a function
我有一个函数foo
。在执行 foo
期间,我想确定 Bar
类型的对象存在。让我们调用恰好是“bar
”的任何对象。
我无法复制或移动 bar
,并且 bar
可以有任何存储期限。关于 bar
我知道的一件事是它是一个空对象。
foo
不需要对 bar
做任何事情或了解它。
首先想到的是,传一个Bar&
到foo
中,告诉调用环境,“嘿,你需要确保bar
在我 运行 时存在!” 但调用环境可以将悬垂引用传递给 foo
,在这种情况下 bar
将在 [=10= 之前被销毁] 运行。
第二个想法是,传递一个shared_ptr
到bar
中。但是(如果我错了请纠正我)这将需要bar
有动态存储期限。
第三个想法是,写一个是可复制和可移动的辅助类型,保证bar
的存在。但这感觉就像重新发明 shared_ptr
轮子。
我有哪些选择可以确保 bar
在 foo
期间存在,它们的优势和局限性是什么?
the calling environment could pass a dangling reference into foo
真的不行。悬挂引用是不合法的,因此发生这种情况的唯一方法是调用者违反语言规则。我认为这不是一个令人信服的问题。
pass a shared_ptr to bar in. But this would require bar to have dynamic storage duration.
不完全是。 shared_ptr 可以用自定义删除器构造,所以如果调用者想传入一个“堆栈分配”Bar
,他们可以用一个不删除任何东西的删除器构造一个 shared_ptr .
bar is that it is an empty object
那么整个练习的重点是什么?是不是因为 Bar
构造函数 and/or 析构函数有副作用,必须 before/after foo
运行?如果是这样的话,也许 foo
应该自己做这些事情,或者可以创建一个 foo_wrapper
函数来隐藏这些细节。
我有一个函数foo
。在执行 foo
期间,我想确定 Bar
类型的对象存在。让我们调用恰好是“bar
”的任何对象。
我无法复制或移动 bar
,并且 bar
可以有任何存储期限。关于 bar
我知道的一件事是它是一个空对象。
foo
不需要对 bar
做任何事情或了解它。
首先想到的是,传一个
Bar&
到foo
中,告诉调用环境,“嘿,你需要确保bar
在我 运行 时存在!” 但调用环境可以将悬垂引用传递给foo
,在这种情况下bar
将在 [=10= 之前被销毁] 运行。第二个想法是,传递一个
shared_ptr
到bar
中。但是(如果我错了请纠正我)这将需要bar
有动态存储期限。第三个想法是,写一个是可复制和可移动的辅助类型,保证
bar
的存在。但这感觉就像重新发明shared_ptr
轮子。
我有哪些选择可以确保 bar
在 foo
期间存在,它们的优势和局限性是什么?
the calling environment could pass a dangling reference into foo
真的不行。悬挂引用是不合法的,因此发生这种情况的唯一方法是调用者违反语言规则。我认为这不是一个令人信服的问题。
pass a shared_ptr to bar in. But this would require bar to have dynamic storage duration.
不完全是。 shared_ptr 可以用自定义删除器构造,所以如果调用者想传入一个“堆栈分配”Bar
,他们可以用一个不删除任何东西的删除器构造一个 shared_ptr .
bar is that it is an empty object
那么整个练习的重点是什么?是不是因为 Bar
构造函数 and/or 析构函数有副作用,必须 before/after foo
运行?如果是这样的话,也许 foo
应该自己做这些事情,或者可以创建一个 foo_wrapper
函数来隐藏这些细节。