2

私は約 4 年間 C++ を使用していませんでしたが、1 か月前に C++ に戻ってきました。そこで CLI 拡張機能について初めて耳にしました。まだ慣れが必要ですが、このサイトはとても役に立ちます!ありがとうございました!!とにかく、次の問題に対する答えが見つかりませんでした。

変数を宣言するとき

int iStack;

次に、宣言されていますが定義されていないため、次のような任意の値を持つことができます

iStack = -858993460

変数が作成されるスタック位置の値に応じて。

しかし、ヒープで変数を宣言すると

int^ iHeap

次に、ハンドルが作成されていることを知っている限り、変数はインスタンス化されていないか(ここでインスタンス化と呼ぶかどうかはわかりません)、定義されていないため、表示することしかできません

iHeap = <Nicht definierter Wert>   (which means <undefined value>)

この値が定義されているかどうかを検出する方法はありますか?

intの場合は特に必要ありませんが、例えば

array<array<c_LocationRef^,2>^>^ arrTest2D_1D = gcnew array<array<c_LocationRef^,2>^>(2);

外側または内側の配列の要素がインスタンス化されているかどうかを確認します(ここではインスタンス化であると確信しています;-))

arrTest2D_1D = {Length=2}
   [0] = {Length=20}
   [1] = <Nicht definierter Wert>  (=<undefined value>)
4

1 に答える 1

2

私の知る限り、CLR は C++ CLI で変数と参照を自動的に初期化します。

.NET では、共通言語ランタイム (CLR) によって、すべての変数が作成されるとすぐに明示的に初期化されます。値型は 0 に初期化され、参照型は null に初期化されます。

変数が初期化されているかどうかを検出するには、hat 変数の値を nullptr と比較する必要があります。

int^ iHeap;
if(iHeap == nullptr){
    Console::WriteLine(L"iHeap not initialised");
}

これは私の VS2010 で動作します。iHeap not initialised
特定の問題(配列)でも機能するはずです。

ちなみに、値の型はゼロに初期化されるため、最初の例は 0 を出力するはずです (テストしたところ、0 が出力されます)。

int iStack;
Console::WriteLine(L"iStrack = {0}", iStack); // outputs 0

引用はnullptrのcodeproject
MSDNページからのものです

編集:今回はマイクロソフトからの別の引用です:

ハンドルを宣言すると、自動的に null で初期化されるため、何も参照しません。

MSDNからの引用は、「トラッキング ハンドル」の段落を参照してください。

于 2013-07-05T06:53:16.980 に答える