none
C++/CLIでのポインタの操作に関すること RRS feed

  • 質問

  • VC++2005です。

     

    ^のポインタは、インクリメント、デクリメントの操作ができないと判断しました。

    この見解について、以下に私の意見を述べますが、これはあってますでしょうか?

     

    マネージド、アンマネージドの違いの要点は、gc機能が効くかどうかである。

    gcにとって、ポインタのインクリメントなどされたら、管理上、都合が悪い。

    なので、インクリメントはできないようにした。

     

    大雑把な概念から、細かい理論まで、全てを把握すれば理解が深まりますよね。

    反論も歓迎です。(ポインタ操作が自由にできるのならばうれしい。)

    よろしくお願いいたします。

     

    2008年4月1日 13:20

回答

  • ^ はポインタではなくハンドル(正確にはトラッキングハンドルだったかな)では?

     

    2008年4月1日 13:35
  •  はなはなはな さんからの引用

    ^のポインタは、インクリメント、デクリメントの操作ができないと判断しました。

    そもそも、^はポインタではありません。

     

    http://www.microsoft.com/japan/msdn/vs05/visualc/VS05Cplus.aspx#vs05cplus_topic2

    ^ 演算子は、CLR 参照型へのハンドルとして変数を宣言します

     

    マネージ(日本語訳では「ド」はつけないらしい)のオブジェクトはGCによって移動されることがあります。

    ハンドルはメモリ上のアドレスを直接指すものではないため、インクリメント・デクリメントしても意味がないものとみられます。

     

     はなはなはな さんからの引用

    反論も歓迎です。(ポインタ操作が自由にできるのならばうれしい。)

    pin_ptrを使っては?

    http://msdn2.microsoft.com/ja-jp/library/9b1fy41s(VS.80).aspx

    2008年4月1日 13:42
    モデレータ
  •  

     

    interior_ptrも忘れないで!pin_ptrのpinしない版みたいなやつです。これこそマネージなポインタです。

    ちなみにvcclr.hのPtrToStringCharsの実装を見たときはショックでした。

    2008年4月21日 8:38

すべての返信

  • ^ はポインタではなくハンドル(正確にはトラッキングハンドルだったかな)では?

     

    2008年4月1日 13:35
  •  はなはなはな さんからの引用

    ^のポインタは、インクリメント、デクリメントの操作ができないと判断しました。

    そもそも、^はポインタではありません。

     

    http://www.microsoft.com/japan/msdn/vs05/visualc/VS05Cplus.aspx#vs05cplus_topic2

    ^ 演算子は、CLR 参照型へのハンドルとして変数を宣言します

     

    マネージ(日本語訳では「ド」はつけないらしい)のオブジェクトはGCによって移動されることがあります。

    ハンドルはメモリ上のアドレスを直接指すものではないため、インクリメント・デクリメントしても意味がないものとみられます。

     

     はなはなはな さんからの引用

    反論も歓迎です。(ポインタ操作が自由にできるのならばうれしい。)

    pin_ptrを使っては?

    http://msdn2.microsoft.com/ja-jp/library/9b1fy41s(VS.80).aspx

    2008年4月1日 13:42
    モデレータ
  • 囚人さん、Azuleanさん、ありがとうございます。

     

    う、ハンドルですか。今の私には、読んでも理解できないようです。が、じっくりこれから調べたいと思います。

     

    マネージとマネージドはすっきりしました。

     

    また、pin_ptrというものを使ってみようと思います。

     

    これでちょっとはまた前進することができます♪

    (内容がないコメントですみません。)

    2008年4月1日 14:14
  • ちょっとだけ情報としてあげときます。

     

    pin_ptrでポインタを使い終わったら、nullptrを代入してアンピンしとく。

    最初これを忘れて、配列をdeleteしようとした時点で例外が発生してました。

    2008年4月1日 15:39
  •  

     

    interior_ptrも忘れないで!pin_ptrのpinしない版みたいなやつです。これこそマネージなポインタです。

    ちなみにvcclr.hのPtrToStringCharsの実装を見たときはショックでした。

    2008年4月21日 8:38
  • Egtraさん、ありがとうございます。

     

    検索したら次のようなサイトが見つかりました。海外のMVPの方が書かれたようです。

     

    http://www.voidnish.com/Articles/ShowArticle.aspx?code=pinnedpointers

     

    GCが動かせて、なおかつポインタが使えるんですね。

     

    私ごとでは、C++はあきらめて、C#のアンセーフを使っています。

    また、余力がでた時にチャレンジしたいと思います。

    2008年4月21日 11:07