我已经有大约 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>)
最佳答案
据我所知,CLR 会自动初始化 C++ CLI 中的变量和引用。
In .NET, the Common Language Runtime (CLR) expressly initializes all variables as soon as they are created. Value types are initialized to 0 and reference types are initialized to null.
要检测变量是否已初始化,您应该将 hat 变量的值与 nullptr 进行比较:
int^ iHeap;
if(iHeap == nullptr){
Console::WriteLine(L"iHeap not initialised");
}
这适用于我的 VS2010 ;它输出iHeap notinitialized
它也应该适用于您的特定问题(数组)。
顺便说一句,值类型初始化为零,因此您的第一个示例应该输出 0(我已经测试过它,它确实输出 0):
int iStack;
Console::WriteLine(L"iStrack = {0}", iStack); // outputs 0
引用自codeproject
MSDN 页面 nullptr
编辑:这是 Microsoft 这次的另一段引用:
When you declare a handle it is automatically initialized with null, so it will not refer to anything.
引自MSDN请参阅“跟踪句柄”段落
关于variables - 如何查明 c++/cli 堆变量是否具有 <未定义值>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17428079/