3

次のコード:

ref class A
{
private:
  int% referenceToAnInt;
};

Visual Studio で次のエラーが発生します。

エラー C3160: 'int %': マネージ クラスのデータ メンバーはこの型を持つことはできません

参照の追跡は管理されたものだと思っていましたが、管理されたクラスのメンバーになれないのはなぜですか? また、値型への参照を C++/CLI に正しく保存するにはどうすればよいですか?

4

2 に答える 2

4

CLR では、追跡参照をフィールドとして格納することはできません。また、C++/CLI-Spec から:

自動以外の保存期間を持つ追跡参照を含むプログラムは、形式が正しくありません。(これにより、トラッキング参照をデータ メンバーとして持つことができなくなります。)

参照先のオブジェクトの実際の有効期間よりも長く参照を保持するという問題を回避したかったのだと思います。別の方法としては、ラッパー ref クラスを使用して値を保持するか、読み取り/書き込み用のデリゲートを使用します。

于 2012-05-03T13:59:32.817 に答える
2

追跡参照「管理対象」であるため、クラスのメンバーとして使用することはできません。&これらは、他のメソッドでローカル変数を参照するために使用できるという点で、C++ 参照に似ています。ただし、ローカル変数は短期ストア (別名スタック) に格納されます。つまり、そのローカル変数を含むメソッドが終了すると、参照は無効になりますが、オブジェクトは引き続き存在する可能性があります。

これはメモリセーフではないため、.Net では禁止されています。

于 2012-05-03T14:04:45.153 に答える