.NET удаляет закрепленный выделенный буфер
У меня есть следующий код для выделения буфера
uns16 m_rawBuffer = new uns16[m_rawBufferSize];
pin_ptr<uns16> ptrAcqBuffer = m_rawBuffer;
Хотя это время от времени pin_ptr, GC изменяет ptrAcqBuffer.
Из документа я вижу
Указатель закрепления - это внутренний указатель, который предотвращает перемещение объекта, на который указывает указатель, в кучу мусора. Таким образом, значение указателя закрепления не изменяется общеязыковой средой исполнения. Это необходимо, когда вы передаете адрес управляемого класса неуправляемой функции, чтобы адрес не изменился неожиданно во время разрешения вызова неуправляемой функции.
Это не имеет смысла для меня... Может кто-нибудь объяснить, пожалуйста? Кроме того, поскольку я создал m_rawBuffer с "новым", мне нужно "pin_ptr"?
Благодарю.
1 ответ
Сборщик мусора перемещает все объекты в управляемой куче всякий раз, когда он выполняет сборку мусора. Это часть его нормальной работы. Вот почему "обычный" указатель на управляемый объект недопустим, поскольку он может быть перемещен сборщиком мусора в любое время.
Указатель булавки помечает объект в управляемой куче как "не двигай меня!", Поэтому указатель остается действительным до тех пор, пока pin_ptr
объект существует. Затем вы можете передать указатель вывода методам, которые ожидают обычный необработанный указатель, и объект, на который он указывает, не будет перемещаться до тех пор, пока pin_ptr
Объект уничтожен.
Все это связано с управляемой кучей. Предполагая, что фрагмент кода, который вы показали, был кодом C++/CLI, вы используете new
разместить массив на обычной неуправляемой куче. Закрепление не нужно, оно не будет двигаться само по себе.
Если бы вы сделали array<UInt16>^ buffer = gcnew array<UInt16>(m_rawBufferSize);
тогда вам понадобится булавка.
... время от времени GC изменяет ptrAcqBuffer.
Я не уверен, что там происходит. Я не уверен что pin_ptr
делает, когда вы пытаетесь дать ему что-то, чего нет в управляемой куче, поэтому можно ожидать странного поведения. Так как булавка вам все равно не нужна, я бы об этом не беспокоился.