問題タブ [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.

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

pointers - 生ポインタを使用するリンク リスト内のノードが破損するのはなぜですか?

リンクされたリストを実装しているときに、生のポインターを学習するのに苦労しています。単純なコードで意図しない結果が得られ、その説明を見つけるのに苦労しています。

(遊び場)

このコードにより、次の出力が得られます。

最初の 2 つの要素では、コードは期待どおりに動作します。次の要素として null ポインターを持つ要素を作成します。2 番目の要素を追加した後の状態は次のとおりです。

3 番目の要素が追加されると、事態はおかしくなり、リンクされたリストは次のように変換されます。

リンクされたリスト要素のnextフィールドが要素自体を指し始めているようです。

メソッドをデバッグしたLinkedListElement::newところ、適切な要素が返されるはずであることがわかりました。

LinkedList::insertメソッドに戻された直後、self.head再代入前でもなぜか中身LinkedList selfが「壊れた」状態になってしまう。

Rust で生のポインターを使用することは慣用的ではないことはわかっていますが、それでも学びたいと思っています。

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

c++ - How to prevent deletion of a raw pointer that is used as shared pointer?

I implemented a C-API for a C++ class which uses shared-pointers of other objects to access them. In my C-API I can of course only get raw pointers. So I "convert" the raw pointer in my C-API to a shared-pointer and use this then with my C++ class methods:

Now I have the problem that at the end of "method" always the shared-pointer destructor is called and it unfortunately kills the object my raw-pointer is pointing at (which I don't want). So, how can I prevent the raw-pointer from being killed?

I already tried shared-pointer functions like reset() or swap(), but they all didn't let my raw-pointer go...

Expected result would be that the raw-pointer e is still pointing to a valid object after this function returned. Actually the raw-pointer points then to a deleted object.

0 投票する
0 に答える
160 参照

rust - Rust で DST のサイズのメンバーを初期化します (ヒープ上)

各ノードに複数の要素が含まれるリンクリストとも呼ばれるチャンクリストを実装しようとしています。これは、リンクリストとVec.

これを行う直感的な方法は次のとおりです。

ここでの問題は、ノードへの参照からベクターの要素にアクセスするには、2 つの逆参照操作が必要であるという事実です。1 つ目は実際のノードを逆参照し、2 つ目はベクターのヒープに格納されたスライスを逆参照します。

Node<T>私の解決策は、最後のフィールドがスライスである DST として定義することでした。

スタック上でインスタンス化できないため、構造体を初期化するのは興味深いことです。

box実験的な構文と両方を試しましstd::alloc::allocたが、成功しませんでした。

私の質問は次のとおりです。すべての優れた慣行を無視して、

  1. これは実際にバージョンよりも効率的Vecですか?そうでない場合、なぜ、逆参照を誤ってカウントしたのか、コンパイラがそれらを最適化するのでしょうか?

  2. このような DST をヒープに直接割り当て、スライスを特定のサイズとして割り当てる方法はありますか。より具体的には(これが進むべき道である場合)、Nodeスライスの前に複数のサイズのメンバーがあったとしますptr.write(...)。コンパイラーが並べ替えを行った可能性がある場合、それらのいずれかを(初期化されていないビットのドロップを避けるために)どのようにすればよいですか?

2番目の質問は議論に関連していると思いますoffset_of!が、よくわかりません。