Какой тип указателя возвращается, если я использую «&» для получения адреса типа значения в C ++ \ CLI? - PullRequest
1 голос
/ 10 декабря 2010

Предположим, я пишу следующий код:

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_ptr» в «int *»
Итак, я узнал, что «& data-> Year» является типом внутреннего указателя.
ОБНОВЛЕНИЯ : Я пытался использовать "& (data-> Year)", та же ошибка.

Но как насчет pAge и pYear?
Это родные указатели, внутренние указатели или закрепленные указатели ??

Если я хочу использовать их в следующей встроенной функции:

void ChangeNumber(int* pNum);

Безопасно ли будет передавать pAge или pYear?

1 Ответ

2 голосов
/ 10 декабря 2010

Они (pAge и pYear) являются нативными указателями, и передача их нативной функции безопасна. Переменные стека (локальные объекты с автоматическим сроком хранения) не подлежат перестановке сборщиком мусора, поэтому закрепление не требуется.

Копирование управляемых данных в стек, а затем передача их собственным функциям, во многих случаях решает проблему gc-moving-managed-data -round (конечно, не используйте ее вместе с обратными вызовами, которые ожидают исходную переменную обновляется до того, как ваша оболочка сможет скопировать значение обратно).

Чтобы получить собственный указатель на управляемые данные, вы должны использовать закрепляющий указатель. Это может быть медленнее, чем метод копирования значения в стек, поэтому используйте его для больших значений или когда вам действительно нужно, чтобы функция работала непосредственно с той же переменной (например, переменная используется в обратных вызовах или многопоточности).

Что-то вроде:

pin_ptr<int> p = &mgd_obj.field;

См. Также документация MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...