c++ - RAII 的有用性无一异常(exception)

标签 c++ exception embedded raii

我最近在 c++ 中发现了 RAII,大多数 RAII 的例子都在谈论异常安全。如何在抛出异常时始终释放资源。

我的问题是,如果您没有打开异常,RAII 是否值得。在我们公司,我们从事 arm 的嵌入式项目,默认情况下异常是关闭的,我们认为没有任何必要。

谢谢大家的回答!

最佳答案

有异常(exception)的 RAII 基本上是一项要求。

无异常(exception)的 RAII 意味着您可以将资源分配与代码结合起来以处置资源。

这让您拥有具有多个导出点的函数,简化了析构函数的编写(RAII 繁重环境中的析构函数通常为空或默认),可以简化对象分配和移动(再一次,通常为空或默认有足够的 RAII 工作).

嵌入式环境的一个典型例子是锁定和解锁一些互斥量。你想保证你不会锁定互斥锁而忘记解锁它。为此,代码纪律意味着您的函数基本上必须有一个退出点,并且有时您必须进行体操以确保这一点发生。

使用 RAII,您只需创建一个拥有锁的 RAII 资源持有者。现在您可以随时返回,解锁资源的代码会自动注入(inject)返回站点。代码流得到简化,资源泄漏也不太常见。

RAII 也是很棒的文档。具有 Foo* 的结构或类可能意味着任何事情:您应该如何以及何时处理该资源尚不清楚。具有 std::unique_ptr<Foo> 的结构或类显然拥有该指针。采用 std::unique_ptr<Foo> 的函数显然正在接管传入的指针的所有权。返回 std::unique_ptr<Foo> 的函数显然是给你该指针的所有权。

关于c++ - RAII 的有用性无一异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17708564/

相关文章:

c++ - 是否可以将 TCP 数据包发送到 UDP-only 服务器?

c++ - 是否可以在 cmake 中更改库链接顺序

java - 捕获异常并重新抛出它,但它不是异常

ubuntu - "ubuntu netbook remix"和 "intel moblin os"是从同一个基础构建的吗?

arm - 加载符号后 GDB 自动执行命令

c++ - 将原始内存数组 (char*) 的内容传递给 std::istream& 参数而不复制缓冲区内容?

c++ - C++中数组的默认值是多少?

delphi - Pascal Synapse 错误处理

c# - 在服务边界记录 WCF 错误

c - 如何在C中找到挂载的U盘大小?