none
Marshal.PtrToStructureについて (ポインタから構造体へコピーを行う場合について) RRS feed

  • 質問

  • byte配列を構造体にコピーしようとしているのですが、 
    Marshal.PtrToStructureはポインタのアドレスをマネージドの構造体に 
    関連付けさせるだけなのでしょうか?
    それとも新たな領域を作成し、指定したポインタから指定した型のサイズ分コピーを行い、それをobjectとして扱うことができるのでしょうか?
    たとえば 
    UData = (UserData)Marshal.PtrToStructure(ptr, typeof(UserData)); 
    この後に ptrをMarshal.FreeHGlobalし、領域を解放した場合、
    今後UDataを使用することは不可能でしょうか(内容は保証されない状態になってしまうのでしょうか)? 
    ご回答よろしくお願いいたします。
    2011年8月16日 17:08

回答

すべての返信

  • ひとことで言えばコピーされます。Managedなオブジェクトは全てManagedなメモリー上に存在するため、Unmanagedなポインターを流用されることはありません。
    # unsafe & ポインターを使えば別ですが。

    Marshal.PtrToStructureを読めば誤解しようもないのですが…どのあたりに疑問を感じたのでしょうか?

    アンマネージ メモリ ブロックから、指定した型の、新しく割り当てられたマネージ オブジェクトにデータをマーシャリングします。
    • 回答の候補に設定 山本春海 2011年8月30日 7:34
    • 回答としてマーク 山本春海 2011年9月2日 4:47
    2011年8月16日 17:54
  • データをマーシャリングします

    初歩的なことかもしれませんが、マーシャリングの意味(処理方法)がよくわかりませんでした。

    マネージドとアンマネージドのシステムの意味があまり理解していないためかもしれません。

     

    2011年8月17日 16:28
  • 新たな疑問がわいたのはわかりますが、元の質問については理解できたのでしょうか?

    マーシャリングは…非.NETのデータ構造を.NETのオブジェクトに変換すること(もしくはその逆)です。

    .NETの全てのオブジェクトはガーベージコレクタによりメモリ管理されています。そのため、.NETのオブジェクトのことをマネージドオブジェクト、そこで使われているメモリをマネージドメモリなどと呼んだりします。ガーベージコレクタの管理外のメモリのことがアンマネージドとなります。

    2011年8月18日 1:23
  • 以下が参考になります。読んで、試してみてください。

    [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

    • 回答の候補に設定 山本春海 2011年8月30日 7:34
    • 回答としてマーク 山本春海 2011年9月2日 4:47
    2011年8月18日 10:30