char* argv[] - wie übergeben; memoryleaks???
-
ich moechte eine extra klasse zum auswerten von uebergabe parametern basteln und muss demnach den array mit zeigern auf char an einem konstruktor uebergeben und in der klasse auswerten. die uebergabe würde so aussehen... vielleicht hat jemand eine bessere lösung??
private: char* ar[]; klasse::klasse( int count, char **arg ) { ar=???? // wie soll ich das hier übergeben??? } int main(int argc, char* argv[]) { klasse oklasse( argc, argv ); return 0; }
also die übergabe stellt mehr immer noch nen rätsel dar und die andere frage ist, dadurch das ja immer nur zeiger erstellt werden und uebergeben werden und diese ja nie geloescht werden, entstehen doch memoryleaks oder, zumindestens würden diese bei objekten entstehen?!
-
der zeiger muss so aussehen:
char (* ar) [MAX] ;
die übergabe erfolgt zum bleistift in dieser form:
klasse::klasse( int count, char arg [] [MAX] ) { ar=arg; }
du arbeitest dann auf dem übergebenen original.
-
elise schrieb:
der zeiger muss so aussehen:
char (* ar) [MAX] ;
Hm nicht ganz, das ist was anderes. argv ist vom Typ her "Array von Zeigern auf char". Dein ar ist "Zeiger auf Array von char". Die beiden sind nicht kompatibel, und können auch nicht ohne weiteres ineinander überführt werden. Die allgemeine Konfusion über dieses Thema kommt vielleicht daher, dass öfters leichtfertig von zweidimensionalen Arrays gesprochen wird. Sowas gibts aber in C++ nicht. Es gibt nur eindimensionale Arrays. Die Elemente eines Arrays können wiederum Arrays sein. Das ist eine Methode, 2D-Arrays zu simulieren. Die andere ist, dass die Elemente eins Arrays Pointer (auf Arrays) sind. Man sollte da sehr genau unterscheiden.
Da argv, wie gesagt, ein Array von Pointern ist, wär das einfachste ein char **, dem argv einfach zugewiesen wird. Speichermanagement ist hier unnötig, da argv das ganze Programm über existiert.
EDIT: Formulierung angepasst
-
verwechselt.. man sollte so früh nix posten.
-
und wie sieht diese zuweisung mit char** aus?? sitze jetzt schon ne ewigkeit -grins... mein konstruktor ist doch richtig oder, aber wie die zuweisung and die private variable...?
das ist richtig, dass argv im ganzen programm über existiert, doch was ist danach, der speicherplatz ist immer noch belegt und kann nicht genutzt werden, da er nicht freigegeben wurde. ich muss nen commandline tool haben das tagelang laeuft ohne den memory zuzupflastern... da muss man doch den speicher freigeben....
-
pinorrix schrieb:
und wie sieht diese zuweisung mit char** aus??
private: char **ar; klasse::klasse( int count, char **arg ) { // so: ar=arg; } int main(int argc, char* argv[]) { klasse oklasse( argc, argv ); }
das ist richtig, dass argv im ganzen programm über existiert, doch was ist danach, der speicherplatz ist immer noch belegt und kann nicht genutzt werden, da er nicht freigegeben wurde.
Das Betriebssystem kümmert sich darum. Du kannst das gar nicht selbst freigeben.
-
ahh danke....
nach langem gruebeln... ich glaube das stimmt, wenn ein programm geschlossen wird, wird wieder alles freigegeben oder? nur wenn ich in einem loop nen pointer erzeuge und diesen nicht mehr loesche, dann gibts leaks... und da bin ich mir eigentlich sicher.... nun gesetzt den fall ich wuerde in einer schleife diese funktion mehrmals aufrufen....
aufruf: function( argv ) function( char **arg ) { char **ar; ar=arg; }
dann wird fuer jeden aufruf speicherplatz reserviert und nicht mehr freigegeben.... ist das so? wie wuerde man den speicher fuer ein zeigervector auf char wieder freigeben?
-
pinorrix schrieb:
dann wird fuer jeden aufruf speicherplatz reserviert und nicht mehr freigegeben.... ist das so?
Nein, du hast nur eine normale Variable - die liegt auf dem Stack, und von dort wird sie wiedrer gepopt (gelöscht) wenn sie den Scope verlässt.
Anders wäre es, wenn die Funktion so aussehen würde:
void f() { char* p=new char[100]; }
Dann würde beim Beenden p zwar zerstört werden, aber der Speicher auf den p zeigt, bliebe unangetastet.
-
pinorrix schrieb:
nach langem gruebeln... ich glaube das stimmt, wenn ein programm geschlossen wird, wird wieder alles freigegeben oder?
Ja schon, aber das hat hiermit nichts zu tun. Mir scheint, du bist gründlich verwirrt
nun gesetzt den fall ich wuerde in einer schleife diese funktion mehrmals aufrufen....
aufruf: function( argv ) function( char **arg ) { char **ar; ar=arg; }
dann wird fuer jeden aufruf speicherplatz reserviert und nicht mehr freigegeben.... ist das so?
Hier wird nirgends Speicher reserviert, oder kannst du mir die entsprechende Stelle zeigen? Von den eigentlichen Pointern mal abgesehen, aber die liegen als Funktionsargumente ja auf dem Stack.
-
aha - ok... den unterschied kannte ich nicht wirklich...
aber besten dank fuer die schnelle hilfe, bin halt auch nur am lernen