gpt4 book ai didi

返回的引用生命周期的 C++ 提示/警告

转载 作者:行者123 更新时间:2023-11-28 06:57:51 25 4
gpt4 key购买 nike

我有一个不太理想的情况,其中一个类返回对对象的句柄引用,这些对象不应在父对象的生命周期后访问。更改以下模式以帮助防御性编码的最佳方法是什么?

// 'A<T>' is a thin factory-style utility class with asynchronous consumers.
template <typename T>
struct A {
A() : h_(*(new T())) { /* ... */ }
~A() { /* h_ deleted or ownership passed elsewhere */ }

// What's the best way to indicate that these handles shouldn't be used after
// the destructions of the A instances?
T &handle() { return h_; }

private
T &h_;
};

struct B { /* ... */ };

int main() {
B *b1{nullptr};
{
A<B> a;

// Is there a good way to trigger detection that the reference is bound to
// a variable which will outlive its 'valid' local lifetime?
b1 = &a.handle();

B &b2(a.handle()); // this is reasonable though

b1->ok_action();
b2.also_alright();
}
b1->uh_oh();
}

我知道您无法真正阻止 C++ 用户执行大多数不安全的操作,但如果我至少可以针对像这样的微不足道的意外使用生成警告,这就是我想要实现的大部分目标。

最佳答案

我冒昧地对您的情况做出一些假设:

  • 句柄指向由 A 由用户自行决定生成的动态分配的对象。
  • 句柄将在 A 超出范围的地方传递,因此 A 不能用作强制网关。
  • 销毁A时必须销毁句柄指向的数据,因此不能对句柄应用自动垃圾回收。
  • 到目前为止,编译时安全检查似乎是不可能的。您希望编码错误通过某种异常机制在运行时表现出来,而不是自发崩溃。

考虑到这一点,这里有一个可能的解决方案:

A 的构造函数中,分配某种信号对象S,它在A 被销毁时设置。使用 shared_ptr 处理 S。让 A::handle 返回一个自定义句柄类 H,它包含一个 B 句柄和一个 shared_ptrS。在 H 中创建一个取消引用运算符,它验证 A 仍然有效(S 未设置),或抛出异常。当所有句柄过期时,S会自动销毁。

关于返回的引用生命周期的 C++ 提示/警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22927517/

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