gpt4 book ai didi

c++ - 使用对象的生命周期作为 setter 的安全性

转载 作者:太空狗 更新时间:2023-10-29 21:31:27 25 4
gpt4 key购买 nike

我制作了一个“作用域 setter ”,它会在超出作用域时自动为变量(通常是 POD)赋值。我主要使用它来跟踪执行当前是否在某个范围内。

template<typename T>
struct FScopedSetter
{
FScopedSetter(T& InObject, T InbOutOfScopeValue)
{
Object = &InObject;
bOutOfScopeValue = InbOutOfScopeValue;
}
virtual ~FScopedSetter()
{
*Object = bOutOfScopeValue;
}

T* Object;
T bOutOfScopeValue;
};

// Example:
bool bInTaskA = false;
void TaskA()
{
bInTaskA = true;
FScopedSetter<bool> Setter(bInTaskA, false);

// ..
}

当我稍后决定在 TaskA 中放置一个额外的 return 语句时,这应该更安全,但忘记在它之前添加 bInTaskA = false。

我的问题是:假设我命名 FScopedSetter 对象,这是正确的吗?至少在使用 POD 时,它会(始终)正常工作吗?我有点担心编译器可能会决定它可以提前结束 setter 的生命周期,因为它未被使用?

谢谢!

最佳答案

别担心,命名的 setter 对象不会在它的时间结束之前被销毁。它会像往常一样被销毁:按照与构造相反的顺序。

但是,发布的代码存在一些小问题。一方面,FScopedSetter 的析构函数不必是虚拟的,因为这里没有继承。

并且 T::operator=(const T&) 绝不能抛出(最好声明为 noexcept),否则作用域分配器类的析构函数可能会抛出。如果您的代码针对 C++11,将 bOutOfScopeValue 移动到 *Object 会更好:

FScopedSetter(T& InObject, T InbOutOfScopeValue)
: Object(&InObject)
, bOutOfScopeValue(InbOutOfScopeValue)
{
}
~FScopedSetter()
{
static_assert(noexcept(*Object = std::move(bOutOfScopeValue)),
"Move assignment of your data type may throw. Make sure it doesn't.");
*Object = std::move(bOutOfScopeValue);
}

并且访问 *Object 可能需要同步,这取决于“任务”是否与“线程”有关。

关于c++ - 使用对象的生命周期作为 setter 的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58116225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com