Questions tagged «raii»



16
从析构函数中抛出异常
大多数人说,永远不要从析构函数中抛出异常-这样做会导致未定义的行为。Stroustrup指出:“向量析构函数显式地为每个元素调用析构函数。这意味着,如果抛出一个元素析构函数,则向量破坏会失败...实际上,没有很好的方法来防止从析构函数引发的异常,因此该库不保证元素析构函数抛出异常”(来自附录E3.2)。 本文似乎另有说法-抛出析构函数或多或少是可以的。 所以我的问题是-如果从析构函数中抛出导致未定义的行为,那么如何处理析构函数期间发生的错误? 如果在清理操作期间发生错误,您是否会忽略它?如果是可以在堆栈中潜在地处理但在析构函数中无法正确处理的错误,那么将异常抛出到析构函数之外是否有意义? 显然,这类错误很少见,但可能出现。


5
我需要手动关闭ifstream吗?
close()使用时需要手动打电话std::ifstream吗? 例如,在代码中: std::string readContentsOfFile(std::string fileName) { std::ifstream file(fileName.c_str()); if (file.good()) { std::stringstream buffer; buffer << file.rdbuf(); file.close(); return buffer.str(); } throw std::runtime_exception("file not found"); } 我需要file.close()手动打电话吗?不应该ifstream使用RAII关闭文件吗?
201 c++  ifstream  raii 


29
避免C ++中内存泄漏的一般准则
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 有什么常规提示可确保我不会泄漏C ++程序中的内存?我如何确定谁应该释放已经动态分配的内存?

12
使用IDisposable和“使用”作为获取“范围内行为”以确保异常安全的手段是否在滥用?
我经常在C ++中使用的一种方法是让类通过构造函数和析构函数A处理另一个类的状态进入和退出条件,以确保如果该范围内的某些事物引发了异常,则当范围已退出。就首字母缩略词而言,这并不是纯粹的RAII,但这仍然是一个既定模式。BA 在C#中,我经常想做 class FrobbleManager { ... private void FiddleTheFrobble() { this.Frobble.Unlock(); Foo(); // Can throw this.Frobble.Fiddle(); // Can throw Bar(); // Can throw this.Frobble.Lock(); } } 需要这样做 private void FiddleTheFrobble() { this.Frobble.Unlock(); try { Foo(); // Can throw this.Frobble.Fiddle(); // Can throw Bar(); // Can throw } finally { …

11
了解术语和概念的含义-RAII(资源获取是初始化)
C ++开发人员能否请我们很好地描述RAII是什么,为什么它很重要以及它与其他语言是否有关联? 我确实知道一点。我相信它代表“资源获取就是初始化”。但是,这个名称与我对RAII的理解(可能是错误的)并不一致:我给人的印象是RAII是初始化堆栈上对象的一种方式,这样,当这些变量超出范围时,析构函数将自动被称为导致资源被清理。 那么为什么不称之为“使用堆栈触发清除”(UTSTTC :)?您如何从那里到达“ RAII”? 以及如何在堆栈上生成将清除堆中内容的内容?另外,在某些情况下您不能使用RAII?您是否曾经希望进行垃圾收集?至少您可以对某些对象使用垃圾收集器,而对其他对象进行管理? 谢谢。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.