New oder lieber char[]?

Hallo Experten,

ich habe eine Frage zum Verwenden von new oder eines statischen char-Arrays:
also, ich will mehrere Strings per Methode aus den Private-Variablen des Objektes auslesen.
dazu habe ich in dem aufrufenden Programm/Funktion ein char-Array mit z.B. 50 Feldteilen erschaffen und and die Methode uebergeben. In der Methode kopiere ich dann einfach per strcpy die Private Variablen in das uebergebene Feld (das ja inzwischen auf einen Pointer zerfallen ist und dessen Gre ich somit auch nicht mehr herausbekommen kann). Das Problem ist nun: was tun, wenn der Anwender meiner Klasse nur ein char-Array mit 2 Feldelementen initialisiert, das an meine Methode uebergibt und meine Methode darein dann einen String mit Laenge 20 reinkopiert. Dann bekomme ich ja Seg-Faults die ich nicht haben mag. Meine berlegung ging jetzt dahin: Im Aufrufenden Programm Vereinbare ich einen Pointer auf char (char *mein_string) bergebe den an die Methode (meineKlasse.meinemethode(*mein_string)), und die Methode legt dann mit *mein_uebergebener_string = new char[strlen(mein_private_string)] freien Speicher fuer das Feld an. Dabei sehe ich dann allerdings ein Problem: wo wird der Speicher wieder deleted? Ich mchte ja auch nicht, dasz mir nach beliebig vielen Aufrufen der Methode der Heap zugemllt ist.

Kann mir jemand helfen?

micha

Ueber c = char[…] kannst Du nur zur Compile-Zeit die Groesse festlegen. bei der Groessenangabe muss es sich also um eine Konstante handeln. Ueber char *p = new char[…] kannst Du die Groesse zur Laufzeit festlegen. Allerdings muss Du später hier auch wieder fürs Aufräumen sorgen, per delete [] p; p=NULL; sonst hast Du Memory-Leckage.

Man kann jetzt seine eigene Klasse schreiben, die das Aufraeumen sicherstellt. Aber die heute zu Verfügung stehend Klassen-Bibliotheken sind in ihrer Leistungsfähigkeit kaum zu überbieten. Also z.B. CStringArray und CString bei MFC oder vector und string bei STL.

so richtig?
Hallo

hab mein Object um zwei static Variablen vom Typ char * erweitert, und raeume mit folgendem Code in der o.g. Methode immer wieder auf. Ist das vom Stil her so korrekt?

.
.
.
 if(static\_vname != NULL || static\_nname != NULL)
 {
 delete [] static\_vname;
 delete [] static\_nname;
 #ifdef debug
 cout

Gruesse Micha


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Bei der Verwendung von static wuerde ich aufpassen. static hat sein Berechtigung aber in diesem Fall geht es ohne static bestimmt eleganter, uebersichtlicher und sicherer.

Ich gehe mal davon aus, das static_vname und static_nname vom Typ „Pointer auf char“ sind.
Des weiteren denke ich, das vname und nname auch „Pointer auf char“ sind und nicht *vname und *nname (also nicht Pointer auf Pointer auf char)!!!

Ist ein Pointer auf NULL, so muss dies nicht unbedingt fuer ein delete geprueft werden.

Sollte Dir beim dynamischen Anlegen von Speicher dieser ausgehen, so ist es fraglich, ob Du ueberhaupt noch eine Fehlerbehandlung durchfuehren kannst. Denn diese Fehlerbehandlung braucht selbst wieder Speicher und der ist definitiv in der Situation nicht mehr da und das ist dann wie ein Griff ins Klo. Entweder verwendet man eine geeignete Exception-Klasse (z.B. ueber #include ) oder man legt beim Starten des Programms ueber einen Buffer erstmal ausreichend Speicher an, den man bei einer Memory-Exception als erstes freigibt um in dem Speicherbereich das Handling dann durchzufuehren.

Ich wuerde die ganze Sache deshalb so schreiben, auch wenn dies hoechstwahrscheinlich nicht korrekt ist, da man das immer im gesamten Kontext eines Programms sehen sollte. Namespace std (std::smile: kann je nach evironment gegebenefalls entfallen.

#include // for I/O
#include // for EXIT\_FAILURE




// Release dynamic allocated memory.
delete [] static\_vname;
delete [] static\_nname;
static\_vname = NULL;
static\_nname = NULL;




char \*vname = NULL;
char \*nname = NULL;




try {
 vname = new char[std::strlen(vorname)+1];
 nname = new char[std::strlen(nachname)+1];

 if ((NULL==vname)||(NULL==nname)) {
 throw "Out of memory";
 }
}




// Catch if memory allocation failure.
catch(const char \*const pChar) {
 delete [] vname;
 delete [] nname;
 vname = NULL;
 nname = NULL;

 std::cout 


    
    // Catch if vorname or nachname are NULL.
    catch(...) {
     delete [] vname;
     delete [] nname;
     vname = NULL;
     nname = NULL;
    
     std::cout 
    
    
        
        // Copy the pointer, not the allocated memory.
        static\_vname = vname; 
        static\_nname = nname;
        
        // Copy the memory. 
        std::strcpy(vname,vorname); // nname=Pointer to destination string.
        std::strcpy(nname,nachname); // vorname = Pointer to Null-terminated source string.
    
    
    
    
    
        
        ...
        rueckgabe = 1;

Fehler:

// Catch if vorname or nachname are NULL.
catch(...) {
 delete [] vname;
 delete [] nname;
 vname = NULL;
 nname = NULL;

 std::cout