MenüHomeBlogMagic

Laufzeitfehler _pFirstBlock == pHead

Dieser Fehler tritt auf wenn eine Klasse einer Dll nicht in dieser mit new angelegt und mit delete auch wieder in dieser gelöscht wird.

Die Dlls nutzen bei statischen Runtimes verschiedene MemoryManager.
Deshalb muss darauf geachtet werden, dass die Allocierten Blöcke sich nicht überschneiden.

Beispiel mit Fehler

Exportierte Dll

class __declspec(dllexport) ExternalClass
{
public
  // Constructor
  ExternalClass(){}
  // Destructor
  ~ExternalClass(){}
}; 

Importierende Applikation

class __declspec(dllimport) ExternalClass

int main()
{
  ExternalClass* pTempClass = new ExternalClass();
  delete pTempClass; //<- Fehler tritt hier auf.
}

Lösungsvorschlag

Durch exportieren von new und delete in Funktionen die zusammen mit der Klasse exportiert werden, löst dieses Problem auf einfache Weise.

In meinen Sourcen löse ich das auf folgende Weise.

Exportierte Dll

class __declspec(dllexport) ExternalClass
{
public
  // Constructor
  ExternalClass(){}
  // Destructor
  ~ExternalClass(){}
  static ExternalClass* create()
    { return new ExternalClass(); }
  static void remove(ExternalClass* pToRemove)
    { delete pToRemove; }
}; 

Importierende Applikation

class __declspec(dllimport) ExternalClass

int main()
{
  ExternalClass* pTempClass = ExternalClass::create();
  ExternalClass::remove(pTempClass); //<- Fehler tritt nicht mehr auf.
}
Permalink: https://adirmeier.de/Blog/ID_166
Tags: Blog, C/C++, Windowsvon am 2017-10-10