2

我已经有大约 4 年没有使用 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 回答