.NET удаляет закрепленный выделенный буфер

У меня есть следующий код для выделения буфера

uns16 m_rawBuffer = new uns16[m_rawBufferSize];
pin_ptr<uns16> ptrAcqBuffer = m_rawBuffer;

Хотя это и есть pin_ptr, GC время от времени модифицирует ptrAcqBuffer.

Из документа я вижу

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

Для меня это не имеет смысла... Может кто-нибудь объяснить? Также, поскольку я создал m_rawBuffer с «новым», нужно ли мне «pin_ptr»?

Спасибо.


person user1296153    schedule 12.07.2018    source источник


Ответы (1)


Сборщик мусора перемещает все объекты в управляемой куче всякий раз, когда он выполняет сборку мусора. Это часть его нормальной работы. Вот почему «обычный» указатель на управляемый объект недействителен, потому что он может быть перемещен в любое время сборщиком мусора.

Указатель булавки помечает объект в управляемой куче как «не перемещать меня!», поэтому указатель остается действительным, пока существует объект pin_ptr. Затем вы можете передать указатель булавки методам, которые ожидают обычный необработанный указатель, и объект, на который он указывает, не будет двигаться, пока объект pin_ptr не будет уничтожен.

Все это связано с управляемой кучей. Предполагая, что фрагмент кода, который вы показали, был кодом C++/CLI, вы используете new для выделения массива в обычной неуправляемой куче. Подвязывать не надо, сам по себе не сдвинется.

Если бы вы сделали array<UInt16>^ buffer = gcnew array<UInt16>(m_rawBufferSize);, вам понадобилась бы булавка.

...время от времени GC модифицирует ptrAcqBuffer.

Я не уверен, что там происходит. Я не уверен, что делает pin_ptr, когда вы пытаетесь дать ему что-то, чего нет в управляемой куче, поэтому, вероятно, следует ожидать странного поведения. Поскольку вам все равно не нужна булавка, я бы не беспокоился об этом.

person David Yaw    schedule 12.07.2018