Pergunta

Eu tenho algum código em C # que tem um invólucro com. Esta com invólucro é usado em um aplicativo nativo c ++. O código C ++ utiliza um método que devolve um conjunto de instâncias de uma classe da biblioteca c #. Os casos vêm de um SafeArray como assim:

for (long i =min; i<=max;i++)
    {   
        IMyInterface *l = (IMyInterface *)malloc(sizeof IMyInterface );

        SafeArrayGetElement(array,&i, &l);
    <other code>

    }

Eu quero liberar a memória alocada para a instância l, mas se eu chamar

free(l)

quando eu fico um acidente.

Eu tentei

VariantClear ((VARIANT*)l);

e usando

SafeArrayDestroy(array)

mas ainda estou vazando 4 bytes para cada instância na matriz.

alguma idéia de como eu deveria ir sobre liberando esta memória?

Foi útil?

Solução

Este código parece um pouco confuso: você está passando "IMyInterface sizeof" para malloc (), que será o tamanho na memória de uma instância de IMyInterface, não um ponteiro para ele: você pode muito bem média "sizeof IMyInterface * "Se você quer alocar memória para um ponteiro.

No entanto, olhando para ele, que não faz qualquer sentido, quer: você não seria melhor não fazer o malloc () em tudo? O último argumento para SafeArrayGetElement () é um ponteiro para a memória que vai segurar o resultado, para que o conteúdo de l (o ponteiro retornado por malloc ()) só vai ser substituído (que é porque free () dá-lhe um acidente). Em outras palavras, apenas isso deve funcionar:

IMyInterface *l;
SafeArrayGetElement(array,&i, &l);

Sem saber exatamente o que está na matriz, não é fácil para ter certeza, mas parece que você está ficando confuso com o velho C / C questão ++ da diferença entre ponteiros e os objetos que eles apontam.

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