C++ cli 如果我使用"&&引用;要获取C+;中值类型的地址+\CLI?
假设我编写以下代码:C++ cli 如果我使用"&&引用;要获取C+;中值类型的地址+\CLI?,c++-cli,C++ Cli,假设我编写以下代码: public ref class Data { public: Data() { } Int32 Age; Int32 year; }; public void Test() { int age = 30; Int32 year = 2010; int* pAge = &age; int* pYear = &year; Data^ data = gcnew D
public ref class Data
{
public:
Data()
{
}
Int32 Age;
Int32 year;
};
public void Test()
{
int age = 30;
Int32 year = 2010;
int* pAge = &age;
int* pYear = &year;
Data^ data = gcnew Data();
int* pDataYear = &data->Year; // pData is interior pointer and the compiler will throw error
}
如果编译程序,编译器将抛出错误:错误C2440:“初始化”:无法从“cli::interior\u ptr”转换为“int*”
因此,我了解到“&data->Year”是一种内部指针。
更新:我试图使用“&(数据->年份)”,同样的错误 但是佩奇和皮耶尔呢?
它们是本机指针、内部指针还是固定指针 如果我想在以下本机函数中使用它们:
void ChangeNumber(int* pNum);
传递pAge或pYear是否安全?它们(pAge
和pYear
)是本机指针,将它们传递给本机函数是安全的。堆栈变量(具有自动存储生存期的局部变量)不会被垃圾收集器重新排列,因此不需要固定
将托管数据复制到堆栈,然后将其传递给本机函数,在许多情况下解决了gc移动托管数据的问题(当然,不要将其与回调结合使用,因为回调期望在包装器有机会复制回值之前更新原始变量)
要获取托管数据的本机指针,必须使用固定指针。这可能比将值复制到堆栈的方法慢,因此,如果值较大,或者确实需要函数直接对同一变量进行操作(例如,该变量用于回调或多线程),请使用该方法
比如:
pin_ptr<int> p = &mgd_obj.field;
pin_ptr p=&mgd_obj.field;
另见