C++ cli 从非托管堆检索托管堆中的数据
这是我在StackOverFLow的第一篇帖子 我试图理解C++/CLI,我有一个非托管结构,它有两个属性getLx和setLx,分别检索指向double的指针和接受指向double的指针。 因此,我在一个非托管方法中填充setLx中的值,并尝试从托管范围中的getLx检索值。我想将非托管堆上分配的数据转换或获取到托管堆 基本上,在下面的示例代码中,我需要来自本机double*本机指针引用类型的double^引用类型C++ cli 从非托管堆检索托管堆中的数据,c++-cli,clr,visual-c++-2015,C++ Cli,Clr,Visual C++ 2015,这是我在StackOverFLow的第一篇帖子 我试图理解C++/CLI,我有一个非托管结构,它有两个属性getLx和setLx,分别检索指向double的指针和接受指向double的指针。 因此,我在一个非托管方法中填充setLx中的值,并尝试从托管范围中的getLx检索值。我想将非托管堆上分配的数据转换或获取到托管堆 基本上,在下面的示例代码中,我需要来自本机double*本机指针引用类型的double^引用类型 第一:尽管它在C++/CLI中是有效的类型,但不应该使用double^。对值类
第一:尽管它在C++/CLI中是有效的类型,但不应该使用double^。对值类型的托管引用是奇怪的、不必要的,并且在其他.Net语言(例如C)中根本不存在 看起来你的double*是一个数组。托管数组类型是array^,而不是double^。这是您应该在托管端使用的。托管阵列也知道自己的长度,因此不需要单独公开计数 为了将数据从double*移动到数组^,需要对其进行复制。无法创建数组对象,使其使用由其他对象分配的内存,因此复制数据是唯一的可能性。您可以使用该方法,也可以使用for循环自己复制数据。它们归结为同一件事
/*Unmanaged Struct*/
struct Grid2D
{
double* getLx() const {
return _Lx;
}
void setLx(double* val) {
_Lx = val;
}
private:
double* _Lx;
public:
int _count;
};
#pragma unmanaged
void UnmanagedFillGrid(Grid2D& d)
{
printf_s("\nunmanaged");
double* item = new double[d._count];
int i = 0;
while (i++ < d._count) {
int r = (rand() % 100) + 1;
item[i] = r;
printf_s("array[%d] = %f\n", i, item[i]);
}
d.setLx(item);
}
#pragma managed
int main(array<System::String ^> ^args)
{
Grid2D d;
d._count = 10;
UnmanagedFillGrid(d);
Console::WriteLine("[managed] count = {0}", d._count);
//getLx returns pointer to double, I need to get in double^
//Is this possible ?
double^ managedLx = d.getLx();//How to convert ??
return 0;
}