問題タブ [dangling-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++ - ターゲットメモリの割り当てが解除されるとNULLに設定されるシンプルで効率的なウィークポインタ
シンプルで効率的なウィーク/ガードポインターはありますか?同じオブジェクトへの複数のポインターが必要です。これらのポインターは、オブジェクトが削除されるとすべて自動的にNULLに設定されます。オブジェクトを削除するために常に使用される「マスター」ポインターが1つありますが、同じオブジェクトを参照する他のポインターがいくつかある場合があります。
これが私のニーズに完全に一致しないいくつかの解決策です:
- QPointer:私はQTアプリを開発していません。このライブラリ/QObjectからの派生物を含めたくありません。
- boost :: weak_ptr:
割り当て解除されたオブジェクトにアクセスすると例外がスローされます。私の状況には高すぎる:弱いポインタをテストするのは正常なはずです。弱いポインタが無効になったときに、手動でクリーンアップする予定です。update:weak_ptrは、例外をスローせずにテストできます - 低オーバーヘッドの弱いポインタ:これは私が探しているものに非常に近いですが、「このスキームは、2 ** sizeof(int)回を割り当てない限り機能することが保証されています。同じ場所です。」
これらの弱い/保護されたポインタが必要な理由: ゲームオブジェクトのリストを含むゲームがあります。一部のオブジェクトは他のオブジェクトに依存しています。たとえば、ゲームエンティティに関連付けられているdebug/statsオブジェクトです。debug / statusオブジェクトは、ゲームエンティティに関する有用な情報を表示しますが、ゲームエンティティが存在する場合にのみ意味があります。したがって、ゲームエンティティが削除された場合、debug / statsオブジェクトはこれを認識し、それ自体を削除する必要があります。(別のアイデアは追跡ミサイルです。それ自体を削除する代わりに、新しいターゲットを検索する場合があります。)
デバッグ/統計ロジックをゲームエンティティから分離したいと思います。ゲームエンティティは、debug/statsオブジェクトがアタッチされていることを知る必要はありません。弱い/保護されたポインターに対する答えを好む一方で、特定のタスクにアプローチするためのさまざまな方法も歓迎します。オブジェクトの存続期間を追跡し、メモリアドレスへの生のポインタの代わりにハンドルを使用するゲームオブジェクトマネージャを実装する必要があるかもしれないと考えています。
私はC++で開発しています。
c - C のダングリング ポインターと文字配列に関する問題
cmd1[0]
内の印刷時に問題がありますmain
。私はそれがダングリングポインターエラーであることを確信しています。私はそれを修正する方法を本当に知りません。
c - ダングリングポインタ、free()後の値変更の理由?
次のコードセグメントでは、の後free(x)
に、なぜy
0になるのですか?
x
私の理解によると、によってポイントされていて、まだによってポイントされているヒープ内のメモリは、y
他の誰かに割り当てられていません。では、どのようにして0に変更できますか?
free(x)
また、 0に変更したのではないと思います。
コメントはありますか?
c - ダングリングポインターとダブルフリー
いくつかのつらい経験を経て、ダングリング ポインターとダブル フリーの問題が理解できました。私は適切な解決策を求めています。
aStruct
他の配列を含むいくつかのフィールドがあります。
正常に終了するfree_aStruct(X)
ように書く方法はありますか?free_aStruct(B)
上記を実行すると、が呼び出されたA = NULL
ときにのみ設定されます。がぶら下がっています。free_aStruct(A);
B
この状況をどのように回避/改善できますか? 参照カウントは唯一の実行可能な解決策ですか? free_aStruct(B);
または、爆発を防ぐために、メモリを解放するための他の「防御的な」アプローチはありますか?
c++ - ポインタを解放する関数を記述し、それにNULLを割り当てる
私は最近のインタビューでこれを尋ねられました。基本的には、無料の機能とnullの割り当ての機能を組み合わせる関数を作成しています。私は次のように答えました:
したがって、実行後、関数から返すときにptr
ローカルtomain
はnull値を保持しますnewdelete
。NULL
newdelete関数で割り当てたばかりの場合、ptr
ローカルtonewdelete
はnullになり、ptr
ローカルtoはnullになりmain
ます。
私の解決策は正しかったと思います。インタビュアーもそれを受け入れました。しかし、彼は他の答えを期待していました。彼は、私が関数からを返さずNULL
、それでも望ましい結果を達成すると主張していました。
それを達成する方法はありますか?私が考えることができるのは、ptr
ローカルのポインタへのポインタである別の引数を渡すことmain
だけですが、なぜそれが私がしたよりも優れているのかわかりません!
c++ - STLコンテナから要素を削除するときにデストラクタが呼び出されますか?
同じオブジェクトへのポインタを格納する2つのコンテナがあるとします。
そのメソッドが次の場合、これらのコンテナの1つからオブジェクトを1つ経由で削除するとします。
CppReferenceは、これがオブジェクトのデストラクタを呼び出すと言っています。これは、のオブジェクトへのポインタfooList
がダングリングポインタであることを意味しますか?
参照カウントポインタは使用したくない。この問題はどのように処理できますか?
c++ - ダングリング ポインターの例
s1.printVal
次のコードで、ダングリング ポインター エラーが発生するのはなぜですか? s1
オブジェクト、つまりそのポインターは、破棄されるまで引き続きアクセス可能ではありませんか?
c++ - C++ で動的に割り当てられたリスト
List
C++ でリストを処理するためのかわいいジェネリック (つまりテンプレート)クラスを作成しました。その理由は、このstd::list
クラスが日常的に使用するにはひどく見苦しく、常にリストを使用しているため、新しいリストが必要だったからです。主な改善点は、私のクラスでは、 を使用[]
してそこからアイテムを取得できることです。また、まだ実装されていないのは、IComparer
物事を分類するためのシステムです。
このList
クラスはOBJLoader
、Wavefront .obj ファイルをロードしてメッシュに変換するクラスで使用しています。OBJLoader
次の「タイプ」へのポインタのリストが含まれています: 3D 位置、3D 法線、UV テクスチャ座標、頂点、面、およびメッシュ。頂点リストには、すべての 3D 位置、3D 法線、および UV テクスチャ座標リストの一部のオブジェクトにリンクする必要があるオブジェクトがあります。面は頂点にリンクし、メッシュは面にリンクします。したがって、それらはすべて相互に接続されています。
List<Person*>
簡単にするために、あるコンテキストでは、ポインターのリストがとの 2 つだけであると考えてみましょうList<Place*>
。Person
class には fieldが含まれList<Place*> placesVisited
、Place
class には field が含まれますList<Person*> peopleThatVisited
。したがって、構造は次のとおりです。
これで、次のコードができました。
すべて完了。に到達するとどうなり}
ますか? すべての dtor が呼び出され、2 回以上削除しようとするため、プログラムがクラッシュします。
リストの dtor は次のようになります。
どこにElem
ある:
そしてT
ジェネリックList
タイプです。
List
クラスを安全に削除するには、どのような方法がありますか? 内部の要素はポインターである場合とそうでない場合があり、それらがポインターの場合、 my を削除するときに、内部の要素を削除するか、それらの周りのラッパーList
だけを削除するかを指定できるようにしたいと考えています。Elem
スマート ポインターが答えになる可能性がありますが、それは を持てないことを意味しますがList<bubuType*>
、List<smart_pointer_to_bubuType>
. これはList<bubuType*>
問題ないかもしれませんが、繰り返しになりますが、a を宣言してもエラーや警告は発生せず、場合によっては、スマート ポインターが実装で問題を引き起こす可能性がありList<PSTR>
ます。PSTR
それらをスマートポインターの中に入れるのは醜い仕事だと思います。したがって、私が探している解決策は、List
テンプレートの割り当て解除システムに何らかの形で関連していると思います。
何か案は?
c - C のダングリング ポインター
ぶら下がっているポインターを持つプログラムを C で作成しました。
ポインターがぶら下がっているにもかかわらず、出力が 100になっています。
上記の関数に 1 つの変更を加えましたfunc1()
。y
上記のプログラムのように標準入力との間で値を取得する代わりに、z
コンパイル時に値を割り当てています。
func1()
を次のように再定義しました。
現在、出力は 200です。
誰かが上記の2つの出力の理由を説明してもらえますか?
c++ - C ++でポインタを初期化することは必須ですか?
t
に値を割り当てる前に、次のコードで初期化する必要がありますt
か?コードは正しいですか?