Domanda

Lingua: C ++

Piattaforma: Windows Server 2003

Ho un exe chiamare una DLL.

Modifica (Exe non sta facendo nulla, si chiama poche funzione globale che fa tutto ciò che riguarda DLL all'interno di DLL. Non lo fa esplicitamente nuovo una delle classi DLL)

I allocare ( nuovo ) la memoria per classe A all'interno della DLL, che mi restituisce un puntatore cumulo non locali .

Ho cercato di nuovo altre classi all'interno della DLL (che sono in DLL), "nuove" restituisce un puntatore mucchio valida per loro, solo il suo Classe A , che è non ripartendo correttamente.

Sono su Windows e convalidare il cumulo da questa chiamata di funzione:

Modifica

 ClassA* pA = new ClassA(); 

 _CrtIsValidHeapPointer ( (const void *) pA )

Sto seriamente confuso il motivo per cui questo accade solo con nuovo ing Classe A e nessun altra classe?

(Tutti codice nativo)

Modifica FINALE:
si è rivelato essere una cattiva costruzione. non può farlo riprodurre in quello nuovo ... sprecato 5 giorni su questo: '(

È stato utile?

Soluzione

Esporta solo le funzioni globali di DLL e call funzioni solo esportate e attraverso v-tabelle. Il tuo problema è solo uno dei tanti causati dal tentativo di esportare intere classi. DLL non sono le stesse di .so librerie.

EDIT:. Dato che la questione ora rivela che la classe non viene esportato, ma tutto questo si osserva all'interno della singola DLL, andando a suggerire altre possibili cause

È lo stesso puntatore restituito da new in fase di sperimentazione, o potrebbe essere un puntatore ad un sotto-oggetto base? Ha fatto l'uso new assegnazione o new []? Uno di questi potrebbe causare il puntatore punto nel mezzo di un blocco mucchio anziché dall'inizio.

Altri suggerimenti

Se le sostituzioni Class A operator new poi la memoria per la classe potrebbe essere allocata in copia della DLL del runtime C. Ciò causerebbe _CrtIsValidHeapPointer a false ritorno -. Perché tuo versione della libreria di runtime C utilizza un mucchio diverso da quello nella DLL

Il valore restituito da _CrtIsValidHeapPointer in genere non è comunque affidabile (certamente, anche se può tornare TRUE non necessariamente significa che si può utilizzo il puntatore). Perché fate questo comunque?

Forse la classe dichiara il proprio operatore di nuovo che lo stoccaggio ottenere da una certa posizione mistero?

es. L'autore della classe può avere scritto:

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

Poi il loro operatore batte nuovo l'operatore di nuovo.

Uno che o la DLL viene costruito con / MTd mentre gli utilizzi eseguibili / MD.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top