問題タブ [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++ - デストラクタではなく、一度に多数のクラスメンバーをリセットする方法は?
単純なクラス型の多くのメンバーを含むクラスがあります。さらに重要なことは、私が開発を進めるにつれて、その数が増えていることです。
それらをすべて一度にリセットできるようにする必要があり、それらをコピーして貼り付けずに実行したいと考えています。コードは現在次のようになっています。
明らかに、すべての新しいメンバーを関数に追加する必要があるのは好きではありませんreset()
(1 つを忘れたというセグメント障害がありました)。
私がやろうとしているのは、それらをすべて構造体にまとめて、この構造体を の下に配置することauto_ptr
です。したがって、コードは次のようになります。
DbProxy のオブジェクトは、コピーまたはコピー構築を意図したものではありませんが、代入と copy-ctor を非公開にすることでこれを保証することはしませんでした。
このアプローチに問題はありますか?他の提案はありますか?
編集
@DeadMGの提案に基づいて、これはどうですか:
c++ - shared_ptr を auto_ptr に変換しますか?
コードで shared_ptr から auto_ptr を取得する必要があります。逆の操作を行うことができます-shared_ptrにはそのようなコンストラクターがあるため、auto_ptrをshared_ptrに変換します。
shared_ptr を auto_ptr に変換できますか? それとも設計上不可能ですか?
c++ - auto_ptr を手放す
時折、ほんの一瞬ですが、auto_ptr はクールだと思います。しかし、ほとんどの場合、それを無関係にするもっと単純なテクニックがあることを私は認識しています. たとえば、例外がスローされた場合でも、オブジェクトを自動的に解放したい場合は、オブジェクトを新しく作成して auto_ptr に割り当てることができます。とてもかっこいい!しかし、もっと簡単に自分のオブジェクトをローカル変数として作成し、スタックに任せることもできたはずです (当たり前!)。
したがって、auto_ptr の使用を禁止しているGoogle C++ コーディング標準を見つけたとき、私はそれほど驚きませんでした。Google は、代わりに scoped_ptr を使用する必要があると述べています (スマート ポインターが必要な場合)。
私の経験に反して、誰かが auto_ptr を使用するのに最適または最も簡単なものであるという確固たる理由を教えてくれるかどうか知りたいです。そうでない場合は、自分で使用することを禁止すると思います(Googleのリードに従って)。
更新:懸念を表明した人のために、いいえ、私はGoogle標準を採用していません. たとえば、Google のアドバイスに反して、例外処理を有効にすることに同意します。また、私が作成した印刷可能な列挙型などのプリプロセッサ マクロを使用することも好きです。私を驚かせたのは auto_ptr トピックです。
update2 : 私の回答は、以下の 2 つのレスポンダーとWikipedia からのメモから得られたものであることがわかりました。まず、Herb Sutter は有効な使用方法を示しました (ソース シンク イディオムとライフタイム リンク オブジェクト構成)。第二に、TR1 とブーストが利用できないか禁止されており、C++03 のみが許可されているショップがあります。第 3 に、ウィキペディアによると、C++0x 仕様は auto_ptr を廃止し、unique_ptr に置き換えています。したがって、私の答えは次のとおりです。(考慮しているすべてのプラットフォームで)使用できる場合は unique_ptr を使用し、それ以外の場合は、Sutter が示すケースに auto_ptr を使用します。
c++ - C++でauto_ptrへのポインタを渡す
私はこれを行う関数を持っています:
そして、次のシグネチャを持つ別の関数内でこの関数を呼び出すことができます。
しかし、それを実行しようとすると、コンパイラエラーが発生します。
最初のパラメータをMyClass*からstd::auto_ptr<_Ty>に変換できません
なぜ?助けてくれてありがとう
編集1 尋ねられたように、myparamsタイプは正常ですが、関数がテンプレートクラス内にあるため、Tパラメータもあります
c++ - コンストラクターへの引数として auto_ptr を渡す
auto_ptr を引数としてコンストラクターに渡せるようにしたい。しかし、新しいオブジェクトを作成できなかった場合 (おそらくメモリがない bcoz)、元の auto_ptr がその値を保持できるようにしたいと考えています。
例えば:
関数 foo() では、メモリ不足のために新しいオブジェクト B が作成されず、オブジェクトを作成せずに new 演算子が返されたときに autop1 値が破棄されました。autop1 にアクセスしようとすると、セグ フォールトが発生します。この問題を回避する良い方法は何ですか。新しいオブジェクトが作成され、所有権がそのメンバー変数に渡された場合は問題ありません。新しい B オブジェクトを作成できず、autop2 が NULL になる場合、foo() で autop1 を使用できるようにしたいと考えています。
c++ - std::auto_ptr で演算子 [] が許可されない理由
std::auto_ptrで演算子[]が許可されないのはなぜですか?
Microsoft Visual C++ 2010 でコンパイルされています。
エラー:エラー C2676: バイナリ '[' : 'std::auto_ptr<_Ty>' は、この演算子または事前定義された演算子に受け入れられる型への変換を定義していません
c++ - g ++での「呼び出しに一致する関数がありません」エラー:コンストラクターまたは演算子=一致しませんか?
代入演算子があります。
g++ コンパイラがこのコードのこの演算子を見つけると期待しています。
コンパイルエラーになりました。
どうしてこれなの?MSVC はこのコードを問題なくコンパイルします。
ソースは以下の通り。
追加した
でAP(const AP<T>& o) : Super(o) { }
、これらのエラーが発生しました。
追加2
それが最善の解決策かどうかはわかりませんが、このコードは機能しているようです。
c++ - std::auto_ptr エラー
以下の C++ コードでは、コンパイラ エラーが発生します。
エラー C2039 が表示される理由がわかりません。VS 2008 コンパイラを使用しています。
助けてください。ありがとう
c++ - 不完全な型へのポインターとスマートポインターの削除
auto_ptr
次のように、前方宣言で宣言された型でを使用しようとすると、次のようになります。
のデストラクタはA
呼び出されません(auto_ptr
内部的delete
には基になるポインタであり、不完全な型のデストラクタは呼び出せないためです)。
ただし、同じコードが正常に機能し、のstd::shared_ptr
代わりにを使用するとデストラクタが呼び出されstd::auto_ptr
ます。それはどのように説明できますか?
c++ - boost::bind への生ポインタ引数を削除する
A*
に引数として渡したいヒープが割り当てられているとしましょうboost::bind
。
boost::bind
のコンテナーのような STL で後で処理するために保存されboost::functions
ます。
A*
STLコンテナの破棄時に確実に破棄されるようにしたい。
説明するには:
どうすればそれができますか?
編集
多分私が望んでいることはそれほど現実的ではありません。
私は生のポインタと生のポインタを受け取る関数を持っています。呼び出しはboost::bindによって遅延されます。この時点で、boost::bind を実行したい場合に備えて、自動メモリ管理が必要です。私は怠け者なので、「準備完了」のスマート ポインター ソリューションを使用したいと考えています。
std::auto_ptrは良い候補のように見えますが...
コンパイルされません (こちらを参照)
pAutoA が破棄され、基になる pA が削除されます。
編集 02
上記のコンテナーでは、さまざまな引数を使用してさまざまな「コールバック」を保存する必要があります。それらのいくつかは、オブジェクトへの生のポインターです。コードが古いので、いつでも変更できるとは限りません。
コールバックをコンテナーに格納するための独自のラッパーを作成することは最後の手段です (おそらく唯一の手段ですが)。