如何确定c ++ / cli堆变量是否具有<undefined value =“”> </undefined>

时间:2013-07-02 14:19:56

标签: variables c++-cli heap undefined

我已经使用C ++大约4年了,一个月前又回来了,这也是我第一次听说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>)

1 个答案:

答案 0 :(得分: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

报价来自codeproject
nullptr

的MSDN页面

编辑:以下是Microsoft的另一个引用:

  

当你声明一个句柄时,它会自动用null初始化,所以它不会引用任何东西。

来自MSDN的引用,请参阅“追踪句柄”

段落