タグ付けされた質問 「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 ++でのメモリリークを回避するための一般的なガイドライン[終了]
現在のところ、この質問は、Q&A形式には適していません。事実、参考文献、専門知識によって回答が裏付けられることを期待していますが、この質問は、討論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問が改善され、場合によっては再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 C ++プログラムでメモリをリークしないようにするための一般的なヒントは何ですか?動的に割り当てられたメモリを解放する必要があるのはどのようにすればよいですか?

12
例外の安全性のために「スコープ付きの動作」を取得する手段としてIDisposableおよび「using」を使用することは悪用ですか?
私がC ++でよく使用したのは、コンストラクターとデストラクターを使用して、AクラスBに別のクラスの状態の開始条件と終了条件を処理させ、Aそのスコープ内の何かが例外をスローした場合にBが既知の状態になるようにすることでした。スコープが終了しました。これは頭​​字語に関する限り、純粋なRAIIではありませんが、それでも確立されたパターンです。 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(Resource Acquisition is Initialization)
C ++開発者に、RAIIとは何か、なぜそれが重要なのか、そして他の言語との関連性があるかどうかについての説明を教えていただけませんか? 私は少し知っています。「リソース獲得は初期化」の略だと思います。ただし、その名前は、RAIIが何であるか(おそらく正しくない)を理解しているとは言えません。RAIIはスタック上のオブジェクトを初期化する方法であり、これらの変数がスコープから外れると、デストラクターが自動的にリソースがクリーンアップされる原因となる。 それでは、なぜ「スタックを使用してクリーンアップをトリガーする」(UTSTTC :)と呼ばれないのですか?そこから「らい」までどうやって行くの? そして、スタック上に存在する何かのクリーンアップを引き起こすスタック上に何かをどのように作成できますか?また、RAIIが使えない場合はありますか?ガベージコレクションを希望していることはありますか?少なくとも、他のオブジェクトを管理しながら、いくつかのオブジェクトに使用できるガベージコレクターはありますか? ありがとう。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.