Объявить нативные типы внутри класса cli? - PullRequest
0 голосов
/ 21 мая 2009

у меня есть

public ref class Test

внутри этого класса, у меня есть:

int frameWidth;
int frameHeight;
int frameStride;

Когда я пытаюсь скомпилировать это, я получаю сообщение об ошибке:

error C2664: 'GetImageSize' : cannot convert parameter 1 from 'cli::interior_ptr<Type>' to 'int *'

GetImageSize - это встроенная функция, и она работает только в том случае, если я переместил объявление вышеупомянутых 3-х целых чисел за пределы класса или внутри блока, который вызывает GetImageSize.

Как я могу решить это?

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

1 Ответ

3 голосов
/ 21 мая 2009

Согласно этому сообщению , причина, по которой вы видите это, состоит в том, что int находятся внутри класса ref, который может перемещаться по куче сборщиком мусора по желанию, адрес int может измениться и тебе не сказали бы.

Чтобы преодолеть это, вы должны сказать ГХ не перемещать объекты, пока вы их используете. Для этого вам нужно использовать

pin_ptr<int*> pinnedFrameWidth = &frameWidth;

затем передайте pinnedFrameWidth в GetImageSize. Pin_ptr будет автоматически приведен к int * при передаче в метод.

Вы должны быть осторожны при использовании pin_ptr. Поскольку GC не может перемещать экземпляр класса Test во время сбора, управляемая куча может стать фрагментированной и, в конечном итоге, производительность может снизиться. В идеале закрепите как можно меньше объектов за минимально возможное время.

В это .Net Rocks show краткое обсуждение указателей выводов.

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