operador "novo" retorno de um não-local do ponteiro de pilha para apenas uma classe?
-
26-09-2019 - |
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 :'(
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.