問題タブ [raw-pointer]
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++11 - C++11 移動代入とコピー代入 (演算子) - 削除の使用
私の現在の理解では、 C++11 の Move および Copy 代入演算子はメモリ リークを防ぐために delete を呼び出す必要がありますが、C++11 の Move および Copy コンストラクターはすべきではありません。
私の理解が正しければ、コンストラクターは を呼び出す必要はありませんが、そのdelete
理由はわかりません。次の例を検討してください。
このウィキペディアの記事のコード例を見ると、次のことが明らかです。
リソースが転送されるため、Move Constructor はリークしません。有効期限が切れていないクラスによってポイントされた割り当てられたデータは、有効期限が切れるクラスに転送され、有効期限が切れるクラスのデストラクタによって削除されます。
ただし、コピーコンストラクターがリークするかどうかについては混乱しています。
Move代入演算子は、ポインターを交換するだけなので、おそらくリークしません。
コピー代入演算子に再び混乱しています。一時オブジェクトの使用が必要な理由がわかりません。私の推測では、リソースが所有し、この関数の最後に範囲外になる
tmp
とother
破棄されますか? (そのリソースがクラスtmp
内のポインタと交換されていることを除いて?)this
便宜上、これからのコードを以下に示します。
これは、(初期化されていない/割り当てられていない) ダングリング ポインターを に設定することが重要である理由のヒントだと思いnullptr
ます。
これは、移動コンストラクターを介してリソースが転送されるが、有効期限が切れるオブジェクトが割り当てられていないダングリング ポインターを受け取る場合が原因だと思う理由ですdelete
。nullptr
(no-op)を指します。
私が提起したポイントのいくつかを誰かが明確にすることができますか?
c++ - C++ 生またはその他のポインターの使用を減らす、および/または null 許容の非ポインターを返す
私は OpenGL を使用して C++ でゲームを作成しており、Unity や Unreal Engine によく似たコンポーネント ベースのシステムを作成することに決めました。コンポーネントとゲームオブジェクトを実装する必要がある段階に達しましたが、これは非常にうまくいきました。
私の実装は機能します...それはまさに私が望む方法ではありません。現在、コンポーネントへのポインタのプライベート ベクトルとしてコンポーネントを格納し、要求されたときにコンポーネントを返します。
例:
コンポーネントは抽象クラスであり、MeshRenderer などのコンポーネントによって拡張されます。
上: 私の AddComponent(); コンポーネントを追加するために使用されるコード - コンポーネントへのポインタが必要です...
上: コンポーネントを GameObject クラスに格納する方法により、インデックスでそれらをループすることができます
このアプローチに関する私の問題は、GetComponent() 関数をどのように実装したかによるものです。Component へのポインターを返し、そのような Component が存在しない場合は nullptr を返す可能性があります。
ここでの問題は、ポインターを返すため、delete を呼び出してポインターを削除できることです。これらは生のポインターですが、GameObject が破棄されたときにプログラムによって処理されるようにしました。(私が無能でない限り) メモリ リークの心配がないことを願っていますが、参照を返すことをお勧めします。それらに対して「削除」を呼び出すことができないという事実-私が犯す可能性のある愚かな間違いを避けるため.
私は変数を非公開にし、GameObject がコンポーネントの削除を処理します。無能などのために何かを削除する機能を自分に許可したくありません。
unique_ptr を返すことを考えましたが、その実装が望ましいかどうかはわかりません。
(追加のメモとして、GetComponent() 関数を使用して何らかの null を返すか、そのようなコンポーネントが存在しないことを示す必要があります)
rust - Rust で生のポインターを逆参照してその関数を適用する、より明確な方法はありますか?
私は Rust で生のポインタを扱っていますが->
、C++ と同様の機能を持つ Rust の演算子が見つからないため、非常に読みにくい行がいくつかあります。存在しますか?
現在読みにくい状態のコードのスニペットを次に示します。
rust - Rust の特定のメモリ位置に構造体をコピーする
たとえば、があるstruct
場合:
0x1000
メモリ内の特定の場所、たとえばメモリ内のポイントに効率的にコピーするにはどうすればよいですか? このようなものは機能しますか?
repr(C, packed)
ここで実際に部品が必要になることに注意してください。
ソフトウェアは、オペレーティング システムやその他の制限なしで、ベア x86_64、リング 0で実行されています。また、私は標準ライブラリなしでプログラミングしているので、これはライブラリだけで達成できるはずcore
です。
もちろん、これは安全ではありませんが、問題ではありません。
編集:明確にする:初期化されていないメモリにコピーしています。
c++ - 生のポインターを使用してベクター内のオブジェクトのプロパティにオブジェクトを割り当てる方法は?
私はC++を使い始めたばかりなので、この質問はおそらく初歩的な質問になるでしょう。しかし、私は自分が間違っていることを見つけることができません。私が取り組んでいるプロジェクトは学校の課題です。この割り当てでは、生のポインターのみを使用することが許可されているため、生のポインターがどのように機能するかを調べます。
今、これらの生のポインタは私にいくつかの問題を引き起こしました. これらのポインターは、「"Room" から "Room *" への適切な変換関数が存在しません」というエラーを出しました。
このエラーがどのように発生したかを説明するために、私が書いたコードの簡素化されたバージョンを提供しようとします。
Level という名前のクラスがあります。これは、部屋を並べてきれいに印刷できるように、ベクトル内にベクトルを持つクラスです。すべての部屋が接続されているわけではないので、他の部屋との接続のために Room direction-properties を与えました。しかし、_rooms[y][x].South を _rooms[y+1][x] に設定して、部屋間の接続を生成しようとすると、. 「"Room" から "Room *" への適切な変換関数が存在しません」というエラーが表示されました。
このエラー メッセージが表示される理由を説明してもらえますか? すべての助けをいただければ幸いです。
c++ - オブジェクトを効率的に渡す?
私のプログラムのほとんどでは、参照によってオブジェクトを渡してきました。
編集する必要がない(その関数を呼び出すだけの)オブジェクトの場合、参照渡しは最もメモリ効率の高いソリューションですか?
または、代わりに生のポインターを使用しますか?
c++ - 参照の混乱による受け渡し?
次の例を検討してください。
これらのメソッドはどちらも参照によって変数を渡している (つまり、コピーを作成していない) と言っていますが、唯一の違いは MyOtherFunction がポインターを受け取っているということですか?
c++ - C++/pimpl:生のポインターまたはunique_ptr? より良い選択は何ですか?
unique_ptr<T>
前方宣言型に aを使用する場合T
、unique_ptr
デストラクタには is complete が必要ですが、次の表によるT
と移動代入演算子 (and ) も必要です。reset
https://stackoverflow.com/a/6089065/1794803
したがって、pImpl
イディオムを正しく実装するには、 thedelete
と theを宣言する必要がありますmove assignment method
(副作用として、インライン化されていないことを示します)。
しかし、std::unique_ptr
は動的メモリの RAII ソリューションであり、pImpl
既にクラス内にいて、とにかくデストラクタを作成する必要があるため、クラスはすでに RAII であるため、生のポインタを管理するだけの方がよいのではないでしょうか? ?の観点からのようにp_impl
:
それはより良い解決策ではありませんか?(+クラスをコピー可能/移動可能にするかどうかを指定する場合は、独自のコピー/移動演算子を定義または削除します。ただし、それは「意識的な選択」です。ただし、移動割り当てを書き込まないでくださいunique_ptr
。エラーです)。
a のみを使用すると、とにかく宣言する必要があるデストラクタunique_ptr
に書かれた a を節約できます。delete p_impl
unique_ptr
例外の場合でも破棄されるローカル動的オブジェクトには優れた選択肢ですが、「属性」の場合、移動代入演算子を書き直す必要があることを覚えていなければ、UB を取得する可能性しかありません。