Pergunta

Eu recentemente vi um casal de projetos de código aberto que, na verdade, fazer isso;voltar inseguro ponteiro de uma função, tais como:"int* entrada = isso.someIterator.GetUnsafePtr()".

No meu entendimento isso tem que estar completamente errado.Inseguro ponteiros só pode ser obtido através de "fixo", demonstrações e, certamente, aqueles devolvidos a partir de dentro de uma função não ser preso mais (eles vão "perder" a sua declarar o âmbito de aplicação), fazendo com que eles, eventualmente, ser lixo coletado.

Mas, então, eu não lembro o compilador dar qualquer aviso sobre isso, então por que se preocupar em usar um fixo declaração, se você pode realmente ter 'removido' ponteiros espalhados por todo?

Foi útil?

Solução

Eu nunca vi tais construções em projetos de código aberto.Será melhor se você fornecer alguns exemplos de tal uso, em sua pergunta.Seu significado pode depende do comportamento.
Mas tenho de concordar, inseguro ponteiros são maus e devem ser usados somente quando você a interagir com alguns nativos ou bibliotecas de código.
Tanto quanto me lembro, você pode usar essa construção só em inseguro bloco.Então eu acho que o compilador não irá dar qualquer aviso aqui.E IMO, é melhor usar IntPtr (inseguro blocos pode ser executado apenas na confiança total).
EDITAR:
@Estevão é direito, IntPtr não vai manter a referência para o objeto no GC coleção.

Outras dicas

Que tal, Marshal.AllocHGlobal ou Marshal.AllocCoTaskMem, ambos retornando intptr, que pode ser lançado livremente para void * usando o .ToPointer() função?

Ou o ponteiro pode se originar do código não gerenciado. Você precisa fix/pin memória porque a memória é gerenciada, portanto, desde que não seja fixed/pinned O coletor de lixo é livre para movê -lo, tornando o ponteiro inválido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top