Pergunta

Temos um código semelhante ao seguinte em um dos nossos projetos. Alguém pode explicar (em Inglês simples) por que a declaração fixo é necessário aqui?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
Foi útil?

Solução

Ela corrige o ponteiro na memória. Lixo coletado línguas têm a liberdade para mover objetos de memória para a eficiência. Isso tudo é transparente para o programador, porque eles realmente não usar ponteiros no código CLR "normal". No entanto, quando você precisar de ponteiros, então você precisa corrigi-lo na memória se você quer trabalhar com eles.

Outras dicas

O fixo declaração vai "pin" a variável na memória para que o coletor de lixo não movê-lo na recolha. Se ele fez mover a variável, o ponteiro se tornaria inútil e quando você usou você estaria tentando acessar ou modificar algo que você não tinha a intenção de.

Você precisa em qualquer lugar que você faz a aritmética de ponteiro, para evitar que o coletor de lixo de movê-lo em você.

Uma vez que está em execução no modo inseguro (ponteiro), a instrução fixo alocar um espaço de memória específico para essa variável. Se você não colocou a instrução fixo, o coletor de lixo pode mover na memória a variável em qualquer lugar, quando ele quiser.

Espero que isso ajuda.

MSDN tem um exemplo muito similar. A declaração fixa, basicamente, blocos de coleta de lixo. Na Net, se você usar um ponteiro para uma localização de memória o tempo de execução pode realocar o objeto para um "melhor" localização a qualquer momento. Então, se você quer a memória de acesso diretamente você precisa corrigi-lo no lugar.

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