トップ回答者
Marshal.PtrToStructureについて (ポインタから構造体へコピーを行う場合について)

質問
-
byte配列を構造体にコピーしようとしているのですが、Marshal.PtrToStructureはポインタのアドレスをマネージドの構造体に関連付けさせるだけなのでしょうか?それとも新たな領域を作成し、指定したポインタから指定した型のサイズ分コピーを行い、それをobjectとして扱うことができるのでしょうか?たとえばUData = (UserData)Marshal.PtrToStructure(ptr, typeof(UserData));この後に ptrをMarshal.FreeHGlobalし、領域を解放した場合、今後UDataを使用することは不可能でしょうか(内容は保証されない状態になってしまうのでしょうか)?ご回答よろしくお願いいたします。
回答
-
ひとことで言えばコピーされます。Managedなオブジェクトは全てManagedなメモリー上に存在するため、Unmanagedなポインターを流用されることはありません。
# unsafe & ポインターを使えば別ですが。Marshal.PtrToStructureを読めば誤解しようもないのですが…どのあたりに疑問を感じたのでしょうか?
アンマネージ メモリ ブロックから、指定した型の、新しく割り当てられたマネージ オブジェクトにデータをマーシャリングします。
-
以下が参考になります。読んで、試してみてください。
[CLR Inside Out]
http://msdn.microsoft.com/ja-jp/magazine/cc164193.aspx[コピーと固定]
http://msdn.microsoft.com/ja-JP/23acw07k[プラットフォーム呼び出しチュートリアル]
http://msdn.microsoft.com/ja-jp/library/aa288468(VS.71).aspx
すべての返信
-
ひとことで言えばコピーされます。Managedなオブジェクトは全てManagedなメモリー上に存在するため、Unmanagedなポインターを流用されることはありません。
# unsafe & ポインターを使えば別ですが。Marshal.PtrToStructureを読めば誤解しようもないのですが…どのあたりに疑問を感じたのでしょうか?
アンマネージ メモリ ブロックから、指定した型の、新しく割り当てられたマネージ オブジェクトにデータをマーシャリングします。
-
以下が参考になります。読んで、試してみてください。
[CLR Inside Out]
http://msdn.microsoft.com/ja-jp/magazine/cc164193.aspx[コピーと固定]
http://msdn.microsoft.com/ja-JP/23acw07k[プラットフォーム呼び出しチュートリアル]
http://msdn.microsoft.com/ja-jp/library/aa288468(VS.71).aspx