ich sitze schon seit Montag an ein und demselben C++-Problem, welches ich kurz schildern möchte.
Situation:
HINWEIS: alles ist stark gekürzt
- DLL A: erstellt mit Borland C++ Builder; wird von Host-Anwendung geladen; unbedingt notwendig wegen hierin realisierter GUI
- DLL B: erstellt mit VS 2005; wird von DLL A nachgeladen; einige Funktionen exportiert
- Daten werden über Zeiger auf struct mit Basis-Datentypen zwischen beiden ausgetauscht
- struct sieht so aus:
struct stParameter
{
char cParameterName[MAXPARLENGTH];
float fParameterValue;
ULONG ulCountCallPath; // Anzahl der Elemente des Parameter-Aufrufpfades
ULONG *pulCallPath; // Zeiger auf Parameter-Aufrufpfad
stParameter()
{
memset(&cParameterName[0], 0, sizeof(cParameterName));
fParameterValue = 0.0F;
ulCountCallPath = 0;
pulCallPath = NULL;
}
~stParameter()
{
if (this->pulCallPath)
{
delete this->pulCallPath;
this->pulCallPath = NULL;
};
};
};
- in DLL A wird eine Funktion von DLL B aufgerufen:
for(i = 0; [...] )
{
stParameter *pParList = new stParameter[iParametersCount];
int iGDFP = pDA->dGParFP(pList[i].ulD, pParList, iParametersCount);
if (iGDFP != -1)
{
for (int j = 0; j < iParametersCount; j++)
{
stParameter *Para = new stParameter(&pParList[j]);
ListItem = lvAvailablePar->Items->Add();
ListItem->Caption = Para->cParameterName;
// [...]
}
else
{
sError = "GetParametersFromPlant";
}
if (pParList)
{
delete []pParList;
pParList = NULL;
}
}
- der fragliche Teil der aufgerufenen Funktion in DLL B
Para->pulCallPath = new ULONG[Para->ulCountCallPath];
Problem:
Alles klappt soweit gut, aber beim Löschen von pParList kommt es dann zum Fehler, wenn im Destruktor der Zeiger gelöscht werden soll. Wenn ich das Löschen auskommentiere, klappt wieder alles.
Frage:
Ist der Destruktor von stParameter so korrekt bzw. wird durch Funktion in DLL B der Zeiger im struct dynamisch?
Dieser Beitrag wurde von Caprio2L bearbeitet: 31. Juli 2008 - 15:51