c ++ - ugyldig hukommelse, når du bruger klasser fra en dll

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er første gang, jeg har forsøgt at eksportere en klasse fra en dll.
hvad jeg har gjort er:
   - crated en grænseflade (kun rene virtuelle metoder)
   - implementeret denne grænseflade i dll med en klasse, der ikke vil blive eksporteret
   - klassen har en udgivelsesmetode, der kalder sletter på dens markør
   - oprettet en fabrikklasse med en statisk metode, der returnerer en peger til betonklassen men som grænsefladen. denne klasse eksporteres.
    - sletningen af ​​det returnerede objekt gøres ved at kalde dens frigivelsesmetode.


Jeg klipper alt dette fra denne tutorial om klasser i dlls. [5]


Problemet er, at når jeg bruger denne dll i et andet projekt, går alt ok, indtil jeg kalder frigivelsesfunktionen på objektet.
Derefter vises et fejlagtigt vindue med meddelelsen '\_ASSERTE (\_BLOCK\_TYPE\_IS\_VALID (pHead-> nBlockUse));'


Er det sket med nogen andre?
Jeg ved, at dette er lige så simpelt som at glemme at bruge std :: når du starter C ++, men som jeg sagde, startede jeg bare dette.


Tak!

Bedste reference


Er din fabriksfunktion defineret i overskriften? Hvis det er, og new for at oprette objektet er i overskriften, og derefter kalder delete inde fra DLL'en, kan denne fejl opstå. Fabriksfunktionen skal eksporteres af DLL, kun erklæringen skal vises i overskriften.


For eksempel skal din overskrift se linje her:


class MyInterface 
{
public:
  virtual void DoSomething() = 0;

  virtual ~MyInterface() {}
};

\_\_declspec(dllexport) MyInterface * \_\_stdcall MyInterfaceFactory();


Implementeringen af ​​MyInterfaceFactory() skal være indeholdt i DLL'en.

Andre referencer 1


Tak for dine svar, og jeg beklager, at jeg startede dette for ingenting!


Problemet var meget simpelt, men gemt bag grænsefladerne, fabrikken og nogle andre ting.
Jeg vendte tilbage en peger til et objekt, der blev erklæret som statisk, fordi det skal være en singleton. Så forsøgte jeg at frigive dette objekt. BANG heap korruption !!


Min singleton-objekt burde ikke have en frigivelsesfunktion i første omgang;
Jeg vil løse dette ved at udpakke frigivelsesfunktionen i en separat grænseflade, som kun vil blive implementeret af ikke-statiske objekter.