問題タブ [auto-ptr]
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.
c++ - auto_ptr コンテンツの三項演算子が機能しない
auto_ptr を NULL に初期化し、ゲームの後半でそれが NULL であるかどうか、またはそれまたは新しいコピーを返さないかどうかを知る必要があります。
私はこれを試しました
そして、他のいくつかの同様のキャストなどがありますが、g ++はauto_ptrsの存在しない演算子を呼び出そうとしますか? 三項比較に RequestContext* を使用する代わりに (三項演算子)。
キャストしてもうまくいきません。
ヒントはありますか?
等しいものを等しくないものに編集
c++ - 非オブジェクトリソースをRAII準拠にする
私のコードでは、HANDLE
からsを使用していますwindows.h
。彼らはのように使用されます
CloseHandle
ご覧のとおり、取得と解放の途中で発生する可能性のあるすべての例外にこれを挿入する必要があります。したがって、1つを忘れて(または知らなかった派手なSEH例外があり)、ボイラーになる可能性があります。メモリリークが発生します。
CloseHandle
最近、私はそのような場合の頭痛を取り除き、これを自動的に呼び出すべきであるRAIIについて読みました。また、C ++のようstd::auto_ptr<someType>
に、で割り当てられたリソースの問題を解決するものがあることもわかりましたnew
。
しかし、私は使用せず、new
ただHANDLE
でtypedef
あるためvoid *
、をどのように使用すればよいのでしょうかstd::auto_ptr<someType>
。どういうわけか、それにカスタム削除関数(if (!CloseHandle(h)) { throw std::exception("closeHandle error"); }
)を与えることが可能であるはずです。クラスのインスタンスがスコープ外になるたびにデストラクタが呼び出されるため、クラスの作成は別のメソッドになります。ただし、単純なことすべてにクラスを設けるのはやり過ぎです。
これらの偶発的なメモリリークを修正するにはどうすればよいですか?
ライブラリがなく、依存関係が大きい純粋なC ++のソリューションを好むことに注意してください。ただし、それらが本当に小さく、ほとんどの環境で使用されている場合を除きます。
c++ - これは素晴らしい std::auto_ptr<> ユースケースですか?
ポインターをパラメーターとして受け入れる関数があるとします。この関数はstd::vector<>::push_back()
、このポインターのライフサイクルを管理するために使用するため、例外をスローできます。次のように宣言すると:
次のように呼び出します。
ポインタを にプッシュする例外がスローされた場合std::vector<>
、事実上メモリリークが発生していますよね?
次のように関数を宣言します。
私の問題を解決しますか?
std::auto_ptr
最初にスタックに割り当てて(例外をスローすることはできなかったと思います)、ポインターに対する所有権を取得できるようにすることを期待しています。安全。
次に、関数内で生のポインターを にプッシュしますがstd::vector<>
、これも安全です。これが失敗した場合、ポインターは追加されませんが、スマート ポインターは引き続きポインターを所有しているため、破棄されます。プッシュが成功した場合、そのポインターに対するスマート ポインターの所有権を削除して戻ります。これは例外をスローできないため、常に問題ありません。
私の理論は正しいですか?
- 編集 -
いいえ、できないと思います。これを行うには、rvalue への非 const 参照を取得する必要があります (スマート ポインターから所有権を奪うため)。私は書かなければならないだろう
それが機能するためには、私の場合はかなり不便です。これを書いているのは、コードをあまり汚さずに RAII を実装できるようにするためです。そんなことをしても何の役にも立ちません。キャッチ22になります。
-- 編集 2 --
読者がすぐに参照できるように、ジェイソン・オレンドルフがここに言ったことをここに引っ張り出すと、最終的な解決策は次のようになります。
これにより、右辺値への無用な非 const 参照の問題が解決されます。
コーディング中のこのクラスを終了したら、誰かが役に立つと思った場合に備えて、ここに投稿します。
-- 編集 3 --
わかりました、ここで多くの議論がありましたが、以前に明確にしておくべき重要なポイントがあります。通常、stackoverflow に投稿するときは、質問の背後にある理由を説明しようとしますが、一般的に、それはまったく役に立ちません。ということで、今回は本題に入ろうと思いました。うまくいかなかったことが判明 XD
残念ながら、私の脳は今行き詰まっているので、目標を達成するために最初に考えたことを正しく説明することさえできないと思います. 多くの場合に適合するアトミック操作と例外セーフなコード作成の適切な解決策を見つけようとしていますが、実際にはそれを処理できません XD これは時間とともに習得するだけの種類のものだと思います.
私はまったく新しい C++ プログラマーで、ゲーム開発に重点を置いています。ゲームエンジンで例外がスローされると、それは実行の終了です。システムはプロセス用にすべてのメモリを解放するので、あちこちで 1 つまたは 2 つのポインターがリークしても問題ありません。サーバー アプリケーションを開発しているので、例外を処理するのが難しいと感じています。例外はサーバーをクラッシュさせることはできないからです。「リクエストをクラッシュさせる」必要があります。
つまり、「お客様、残念ながら開発者はこの状態を予測していませんでしたので、後で試していただく必要があります (ここまでは基本的にゲーム エンジンと同じで、何も修復されていないだけです。プロセス全体ではなく、リクエストのみのコンテキストに分離されます。ただし、すべてが有効な状態のままであるため、パニックにならないでください (ただし、ここに違いの 1 つがあります。プロセスは終了しないため、オペレーティング システムはリソースを解放できません。さらに、これまでの操作を元に戻すには注意が必要です。たとえば、ユーザーのアカウントを完全にロックしたり、サーバーが提供する完全なサービスをロックしたりしないようにする必要があります。 )」。
次回はより良い質問を書くことができるように、どんどんコーディングして問題を書き留めます。今さら質問する気になれませんでした、本当に申し訳ありません。
返信ありがとうございます。私はスタックオーバーフローが本当に好きです。私の質問に対する回答の速さと、あなたの回答がどれだけ啓発的であるかには、本当に驚くべきものがあります。ありがとう。
c++ - C++: auto_ptr + 前方宣言?
私はこのようなクラスを持っています:
.cpp では、コンストラクターがInner
withのインスタンスを作成しnew
、デストラクターがそれをdelete
s します。これはかなりうまくいっています。
このコードを使用するように変更したいので、次のauto_ptr
ように記述します。
これで、コンストラクターが を初期化しauto_ptr
、デストラクタは何もしません。
しかし、うまくいきません。このクラスをインスタンス化するときに問題が発生するようです。次の警告が表示されます。
警告 C4150: 不完全な型 'Inner' へのポインターの削除。デストラクタが呼び出されていません
ええと、これは明らかに非常に悪いことであり、私はそれが起こる理由を理解していInner
ます.auto_ptr<Inner>
だから私の質問:auto_ptr
単純なポインターだけを使用するバージョンで行ったように、前方宣言で使用する方法はありますか?
ポインターを宣言する#include
すべてのクラスに対して行うことは、非常に面倒で、時には不可能なこともあります。この問題は通常どのように処理されますか?
c++ - auto_ptr のインターフェイスが 2 つのコピー コンストラクターのようなコンストラクターを指定するのはなぜですか
このリンクauto_ptrの auto_ptr ドキュメントを調べ ていましたが、なぜそれが行われたのか完全には理解できませんでした。インターフェイス セクションには、コピー コンストラクターの宣言が 2 つあります。
1)
2)
これは何の目的で。
c++ - auto_ptr_ref とは何か、何を達成し、どのように達成するか
ここのauto_ptr_refドキュメントはこれを 言います
This is an instrumental class to allow certain conversions that allow auto_ptr objects to be passed to and returned from functions.
auto_ptr_ref がこれを達成するのにどのように役立つかを誰かが説明できますか? auto_ptr クラスとその内部構造を理解したいだけです
c# - c++ auto_ptr はマネージ ポインター (Java、C#...) とどのように関連していますか?
私は管理された世界から来て、C ++の自動メモリ管理は私にとって非常に不明確です
私の理解が正しければ、ポインタをスタック オブジェクト内にカプセル化し、auto_ptr が範囲外になると、指定されたオブジェクトに対して自動的に削除を呼び出しますか?
どのような使い方をすればよいのでしょうか? また、C++ 固有の問題を自然に回避するにはどうすればよいでしょうか?
c++ - auto_ptr は非推奨ですか?
- 次の C++ 標準で auto_ptr は廃止されますか?
- 所有権の譲渡には、shared_ptr の代わりに unique_ptr を使用する必要がありますか?
- unique_ptr が標準にない場合、代わりに shared_ptr を使用する必要がありますか?
c++ - 関数への参照によって auto_ptr を渡すことはできますか?
次の機能はOKです:
c++ - std::auto_ptr<>::operator = 既存の指示対象をリセット/割り当て解除する必要がありますか?
ここで std::auto_ptr<>::operator= について読みました
ただし、左側のオブジェクトが既に何らかのオブジェクトを指している場合、そのオブジェクトの割り当ては自動的に解除されないことに注意してください。これを明示的に行うには、新しい値を割り当てる前にメンバー関数 reset を呼び出します。
しかし、ヘッダーファイルのソースコードを読むとC:\Program Files\Microsoft Visual Studio 8\VC\ce\include\memory
正しい/標準的な動作は何ですか? 他の STL 実装はどのように動作しますか? 上記の Web サイトに間違った情報や古い情報が含まれている場合、参考としてどの Web サイトをお勧めしますか?