問題タブ [raii]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
6483 参照

c++ - ブーストまたは C++0x の任意の RAII テンプレート

ブーストで利用できるテンプレートはありますかRAII。基本的にポインターで動作するscoped_ptrのようなクラスがあります。shared_ptrこれらのクラスは、ポインター以外の他のリソースに使用できますか? 一般的なリソースで機能するテンプレートはありますか。

たとえば、スコープの開始時に取得され、スコープの終了時に何らかの方法で解放する必要があるリソースを考えてみましょう。取得と解放の両方で、いくつかの手順が必要です。このタスクを実行する 2 つ (または場合によっては 1 つのオブジェクト) のファンクターを取るテンプレートを作成できます。これを達成する方法を考えたことはありませんが、それを行うための既存の方法があるのだろうかと思っていました

Edit:ラムダ関数をサポートする C++0x の 1 つについてはどうでしょうか。

0 投票する
8 に答える
757 参照

c++ - 文字ポインタでRAIIを使用する

多くのRAIIサンプルクラスがファイルハンドルをラップしているのがわかります。

私はこれらの例を運がなくても文字ポインタに適合させようとしました。

私が使用しているライブラリには、文字ポインタのアドレスを受け取る関数があります(get_me_a_string(char ** x)のように宣言されています)。これらの関数は、その文字ポインタにメモリを割り当て、ライブラリのエンドユーザーに任せて、独自のコードでクリーンアップします。

だから、私はこのようなコードを持っています...

RAIIは私が上で持っているこの混乱の答えであるように思えます。誰かがFILE*ではなくchar*をラップする単純なC++クラスを提供できますか?

ありがとう

0 投票する
6 に答える
750 参照

c++ - リソース管理クラス(C ++)でのプライベートメソッドのユニットテスト

以前、別の名前でこの質問をしましたが、よく説明できなかったため削除しました。

ファイルを管理するクラスがあるとしましょう。このクラスがファイルを特定のファイル形式を持つものとして扱い、このファイルに対して操作を実行するためのメソッドを含んでいるとしましょう。

チェックサムを計算するこのクラスの部分を単体テストできるようにしたいとします。ファイルをロードするクラスの部分などを単体テストすることは実用的ではありません。getChecksum()メソッドのすべての部分をテストするには、40個または50個のファイルを作成する必要があるかもしれないからです。

ここで、クラスの他の場所でチェックサムメソッドを再利用したいとします。メソッドを抽出して、次のようにします。

ここで、テストが簡単で複雑なため、このメソッドを単体テストしたいと思います。また、単体テストは単純で非常に難しいため、calculateChecksum()気にしません。ただし、直接getChecksum()テストすることはできません。calculateChecksum()private

誰かがこの問題の解決策を知っていますか?

0 投票する
10 に答える
114731 参照

c++ - Resource Acquisition is Initialization (RAII) とはどういう意味ですか?

Resource Acquisition is Initialization (RAII) とはどういう意味ですか?

0 投票する
3 に答える
1482 参照

c++ - RAII および C++ STL

リソースのリストを std::vector に保存したい場合があります。私が見ているように、私のオプションは次のとおりです。

  1. リソースにデフォルトのコンストラクターを与える
  2. それらをヒープオブジェクトとして保存します(共有ポインターでラップします)

オプション 1 は無効なリソースを構築することを可能にし、オプション 2 はヒープの使用を強制します。

ここにオプションがありませんか?

0 投票する
3 に答える
1796 参照

c++ - RAIIとGOTOを組み合わせるとどうなりますか?

RAIIの振る舞いがgotoの使用とどのようにかみ合うかについての純粋な好奇心(誰もこのようなコードを書くべきではないからです!)以外の目的ではないのだろうかと思います(素敵なアイデアではありません)。

Visual Studio 2005で次のコードを実行すると、次の出力が得られます。

しかし、私は想像し、推測し、「BOO!」を望んでいました。Ghostがインスタンス化されるべきではなかったため、実際には表示されません(IMHO、このコードの実際の予想される動作がわからないため)。

どうしたの?


Ghostの明示的なコンストラクターをインスタンス化すると、コードがコンパイルされないことに気づきました...

ああ、謎...

0 投票する
4 に答える
18118 参照

c++ - 一意の名前を生成するためのC/C++マクロ/テンプレートblackmagic

マクロは問題ありません。テンプレートは問題ありません。それが機能するものはほとんど何でも問題ありません。

例はOpenGLです。ただし、この手法はC ++固有であり、OpenGLの知識に依存していません。

正確な問題:

式Eが必要です。ここで、一意の名前を指定する必要はありません。Eが定義されている場所でコンストラクタが呼び出され、ブロックEが終了している場所でデストラクタが呼び出されるようにします。

たとえば、次のことを考慮してください。

手動による解決策:

これは、glTranslateだけでなく、他の多くのPushAttrib/PopAttrib呼び出しにも使用できます。各変数に一意の名前を付ける必要はありません。マクロテンプレートに関連するトリックはありますか...または定義の時点でコンストラクターが呼び出される変数を自動的に作成する何か他のものがありますか?ブロックの終わりにデストラクタが呼び出されましたか?

ありがとう!

0 投票する
1 に答える
96 参照

c++ - これは、COM の初期化を管理する良い方法ですか?

私はコンポーネント オブジェクト モデルに関連するものにはまったく慣れていないので、CoInitalize/CoUninitalize への呼び出しを管理するこの方法が理にかなっているのかどうか疑問に思っています。

COM.hpp:

COM.cpp:

次に、COM を必要とするすべてのコンポーネントは、COM を呼び出すだけでCOM::Setup()それを忘れます。

これは理にかなっていますか、それとも COM の「規則」に違反していますか?

0 投票する
8 に答える
7177 参照

c++ - 自動リソース管理には、C ++のどのラッパークラスを使用する必要がありますか?

私はC++のアマチュアです。私はいくつかのWin32APIコードを書いていますが、ハンドルと奇妙に複合的に割り当てられたオブジェクトがたくさんあります。だから私は疑問に思っていました-リソース管理を簡単にするラッパークラスはありますか?

たとえば、データをロードしたい場合は、でファイルを開いてCreateFile()を取得しHANDLEます。それが終わったら、私はそれを呼び出す必要がCloseHandle()あります。ただし、かなり複雑なロード関数の場合、例外は言うまでもなく、数十の出口ポイントが考えられます。

CloseHandle()したがって、実行がスコープを離れると自動的に呼び出される、ある種のラッパークラスでハンドルをラップできれば素晴らしいと思います。さらに良いことに、参照カウントを実行できるので、他の関数に出し入れすることができ、最後の参照がスコープを離れたときにのみリソースを解放します。

コンセプトはシンプルですが、標準ライブラリにそのようなものはありますか?ちなみに、私はVisual Studio 2008を使用していますが、Boostなどのサードパーティのフレームワークをアタッチしたくありません。

0 投票する
2 に答える
538 参照

c++ - リソース取得は初期化「RAII」

以下の例では

あるサイトからこの RAII の例を入手しましたが、いくつか疑問があります。助けてください。

  1. x のコンストラクターでは、「メモリ割り当てが失敗した場合」というシナリオを考慮していません。
  2. ここで、Y のデストラクタは安全です。y の場合、constructor はメモリを割り当てていません。y コンストラクターでもメモリ割り当てを行う必要がある場合はどうなりますか?