Stackpointer oder Heappointer

Hallo zusammen,

ich bekomme in einem Programm von mir, das mit Visual C++ 6.0 kompiliert ist, beim delete-Aufruf eines Pointers immer die Debug-Fehlermeldung (Debug-Assertion schlägt fehl), dass es sich bei dem Zeiger nicht um einen Heappointer handelt. Ich denke aber schon, dass es einer ist. Damit ihr die Situation beurteilen könnt, hier mal der Code:

void Function1(CString\* &pcsTexts, int nNumber){
 //Anlegen eines Heappointers
 CString\* pcsList = new CString[nNumber];
 //Rückgabe des angelegten Speichers an die Außenwelt
 pcsTexts = pcsList;
 //Daten in die einzelnen Arrayfelder schreiben...
}

//Hauptprogrammteil
//Anlegen eines Pointers
CString\* pcsTexts = NULL;
int nNumber = 4;
//Übergabe an Function1 (siehe Funktionsdefinition oben)
Function1(pcsTexts, nNumber);
//Nach Verarbeitung
delete pcsTexts //hier schlägt die Debug-Assertion fehl

Verstehe ich irgendwas nicht richtig? Ist pcsTexts am Ende nun ein Stackpointer oder Heappointer, muss ich ihn löschen oder nicht?
MfG
MacFrenzy

Moin.

CString* pcsList = new CString[nNumber];

pcsTexts = pcsList;

delete pcsTexts //hier schlägt die Debug-Assertion fehl

Mach mal:

delete **[]** pcsTexts;

Zu new gehört delete, und zu new[] gehört delete[].

Gruß,
Ralf

Eigentlich müsste beim Compilieren
eine Warnung kommen.
Der Level der Verzeigerung stimmt nicht.
Du möchteset das deleten,
wo pcsTexts drauf zeigt,
du löschst aber pcsTexts selbst,
der is aber auf dem stack, und es kracht.
Versuch delete *pcsTexts;

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke für eure Antworten.

Mit delete *pcsTexts funktioniert es nicht, da streikt schon der Kompiler, was aber auch verständlich ist, da delete ein Argument von Typ void* erwartet und mit *pcsTexts ja der Speicherinhalt von pcsTexts[0] zurückgeliefert wird, also eine Variable vom Typ CString (* ist doch hier der Dereferenzierungsoperator).

Mit delete[] pcsTexts funktioniert es dafür. Die Debug Assertion verschwindet und eine Meldung über detektierte Memory Leaks gleich mit. War mir gar nicht bewusst, dass ein Unterschied zwischen delete und delete[] besteht. Danke also nochmals für die Aufklärung!

MacFrenzy