2

我只是对 C++/CLI 句柄(^)及其工作原理感到好奇。例如:

我无法理解的第一件事是,在这里接受的答案说插入符号是*(指针)的托管等效项。但是,与 * 不同,我可以直接为 ^ 赋值。

int ^num;
num = 4;

这在 C++ 中不起作用:

int *num2;
num2 = new int[1];
num2 = 10;

为什么会观察到这种行为?此外,在 Microsoft网页中,他们说您不能指向对象的成员,并且它不支持指针算术。所以下面的代码片段都无法编译

int ^num3 = gcnew int[10];

for(int i = 0; i<10; i++)
    %(num3 + i) = i

或者

for(int i = 0; i<10; i++)
    (num3 + i) = i

为什么???

这让我想到了最后一个问题:在 C++/CLI 中遵循 int 本机/普通 C++ 代码片段相当于什么?

int *array1;
array1 = new int[ 10];

for( int i = 0; i < 10; i++)
     *(array1 + i ) = i;
4

2 回答 2

4

int^表示对装箱整数的引用。
它不是指向常规整数的指针。

CLR 中引用类型的句柄不等同于指针。这是相似的。

两者都“指向”一个对象,但这就是相似性结束的地方。
它更像是一个 C++ shared_ptr

无论如何,装箱整数是包装整数的对象。
int^是对装箱对象的引用,因此除了保存值之外,它还可以为 null(因为它是引用)。

当您执行int^ = 4;装箱对象的构造函数时,构造一个值为 4 的装箱对象。
因此,与 c++ 指针不同,您不是指向地址“4”,而是“指向”恰好包含值 4 的对象.

于 2013-01-12T21:12:27.273 回答
1

^等效于*, 用于处理类对象(new/gcnew、作为参数传递、作为类定义的一部分存储等)。指针算法在 C++/CLI 中是不一样的。

这是您的代码片段的等价物:

array<int>^ array1;
array1 = gcnew array<int>(10);

for (int i = 0; i < 10; i++)
    array1[i] = i;

array<int>^:这是一个托管引用,存储在堆栈中。

array1 = gcnew array<int>(10):这是在托管堆上创建一个托管对象(来自名为“array”的类),并将引用分配给堆栈上的局部变量。

array1[i] = i:在幕后,这调用了“数组”类的一个方法,将索引和新值传递给它(i在这种情况下都是如此)。

于 2013-01-12T21:11:45.070 回答