Pergunta

Idioma :C++

Plataforma :O Windows Server 2003

Eu tenho um exe chamar uma DLL.

EDITAR : (exe não está fazendo nada, ele chama alguns função global que faz tudo relacionado a DLL dentro da DLL.Ele não explicitamente novo qualquer uma das classes DLL)

Eu alocar (novo) a memória para classe A dentro da DLL, devolve-me um não-local do ponteiro de pilha.

Eu tentei novo outras classes dentro da DLL (que estão na DLL), "novo" retorna um válido ponteiro de pilha para eles, seu único Classe A o que não está sendo alocado corretamente.

Estou no windows e validar a pilha por isso chamada de função :

EDITAR:

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

Eu sou a sério confuso porque isso só acontece com novo-ing Classe A e nenhuma outra classe ?

(Todo O Código Nativo)

EDIÇÃO FINAL :
girou para fora para ser uma má construir.pode não conseguir reproduzir em um novo...desperdício de 5 dias sobre isso :'(

Foi útil?

Solução

Exportar somente as funções globais a partir de DLLs e chamar apenas as funções exportadas e, através do v-tabelas.O seu problema é apenas um dos muitos causado pela tentativa de exportação de classes inteiras.DLLs não são o mesmo .assim bibliotecas.

EDITAR:Desde agora, a questão revela que a classe não é exportado, mas tudo isso é observado dentro da única DLL, vai sugerir outras causas possíveis.

É o mesmo ponteiro retornado de new está sendo testada, ou pode ser um ponteiro para uma base sub-object?Fez a alocação de usar new ou new []?Qualquer um desses poderia fazer com que o ponteiro aponte para o meio de um bloco de memória em vez de o iniciar.

Outras dicas

Se Class A substituir operator new Em seguida, a memória dessa classe pode ser alocada na cópia da DLL do tempo de execução C. Isso causaria _CrtIsValidHeapPointer para retornar false - Porque sua A versão da biblioteca de tempo de execução C está usando um heap diferente daquela na DLL.

O valor retornado de _CrtIsValidHeapPointer Geralmente não é confiável de qualquer maneira (certamente, mesmo que possa retornar verdadeiro, não significa necessariamente que você pode usar o ponteiro). Por que você faz isso de qualquer maneira?

Talvez a classe declare seu próprio operador novo que obtém armazenamento de algum local misterioso?

por exemplo, o autor da classe pode ter escrito:

class MyClass {
   public:
     void * operator new (size_t amt);
     void operator delete(void *);
};

Em seguida, o operador deles vence seu operador novo.

Isso ou a DLL é construída com /mtd enquanto o executável usa /md.

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