Pregunta

Idioma: C ++

Plataforma: Windows Server 2003

Tengo un exe llamar a una DLL.

EDIT: (Exe no está haciendo nada, se llama función de unos pocos global que hace todo lo relacionado con DLL dentro de DLL. No lo hace de forma explícita nueva cualquiera de las clases DLL)

asigno ( nueva ) la memoria para clase A dentro de la DLL, me devuelve un puntero del montón no local .

Traté de nueva otras clases dentro de la DLL (que están en DLL), "nuevos" devuelve un puntero montón válida para ellos, su único Clase A , que es no se asignen correctamente.

Estoy en ventanas y validar el montón por esta llamada de función:

EDIT:

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

Estoy seriamente confundido por qué esto sólo ocurre con nueva ing Clase A y ninguna otra clase?

(Todo código nativo)

edición final:
que resultó ser una mala construcción. no puede conseguir que se reproducen en el nuevo ... desperdiciado 5 días en esto: '(

¿Fue útil?

Solución

Exportar sólo las funciones globales de DLL y llamar a funciones sólo exportadas e través de V-mesas. Su problema es sólo uno de muchos causada por tratar de exportar clases enteras. DLL no son los mismos que .so bibliotecas.

EDIT:. Dado que la pregunta ahora revela que la clase no se exporta, pero todo esto se observa dentro de la única DLL, va a sugerir otras causas posibles

es el mismo puntero de regresar de new que se prueba, o podría ser un puntero a una sub-objeto base? ¿El uso de la asignación o new new []? Cualquiera de ellas podría hacer que el puntero en el punto medio de un bloque del montón en lugar de la salida.

Otros consejos

Si anula Class A operator new entonces la memoria para esa clase podría ser asignado en la copia del archivo DLL del tiempo de ejecución C. Esto causaría _CrtIsValidHeapPointer a false retorno -. Porque versión de la biblioteca de tiempo de ejecución C utiliza una pila diferente a la que en la DLL

El valor devuelto por _CrtIsValidHeapPointer generalmente no es de todos modos fiable (por cierto, a pesar de que puede devolver TRUE no necesariamente significa que usted puede uso el puntero). ¿Por qué haces esto de todos modos?

Tal vez la clase declara su propio operador nuevo que el almacenamiento de obtener de algún lugar misterioso?

por ejemplo. El autor de la clase puede haber escrito:

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

A continuación, el operador de nuevos golpes con el operador de nuevo.

O eso, o la DLL está construida con / MTd mientras que los usos ejecutables / MD.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top