Zitat von
RHBaum
@Giuly
Genau .
richtig speicher allokieren :
mach nur das dynamisch, was unbedingt dynamisch sein muss !
temporaer 1024 byte anlegen und gleich wieder freigeben macht kein sinn, weil das wuerde locker aufn stack passen = 100mal performanter
char* site = getSite(user, pass);
free(site);
sehr sehr schlechter Stil !
besser:
char buffer [1024];
getSite(buffer,1024);
oder richtig dynamsich :
size_t size = 0;
getSite(NULL,&size);
if(size)
{
char * pBuffer = (char *)malloc(size * sizeof(char));
getSite(pBuffer,&size);
// .... was man damit tun wollte
free(pBuffer);
}
ne wichtige Regel:
Allokiere den Speicher immer im selben block, wo du ihn auch freigibst ! Sonst kommst irgendwann in teufels kueche ! Quasi ausnahme unter c++ : Konstruktor und destruktor einer klasse, das ist nicht der selbe block aber ebend auch sehr zusammenhaengend ^^
also ne getSite funktion die dir nen allokierten pointer zurueckgibt, und drauf baut das ihn selber freigibst ist designtechnisch eher bedenklich, ausserdem unflexibel, weil die nie mit stackspeicher funzen wuerde (ok nur relevant wenn mikrocontroller proggst ^^)
damit die funktionen die dir undefiniert viel speicher beschreiben auch funktioneren, haben solche methoden meist 2 "Modis".
Wenn der Zeiger auf den Speicher auf den sie schreiben sollen 0 ist, dann geben sie nur die Groesse des benoetigten speichers zurueck ....
ist der zeiger nicht 0, schreiben sie das ergebnis auf den speicher, aber nur soviel wie sie mit dem anderen parameter vorgegeben bekommen. (falls es mal mehr ist, das sie da nich ueber den speicher hinausschreiben ) meist geben die funtkionen dann nen fehlerwert, oder die anzahl der geschriebenen bytes inklusive fehlerwert (wenn negativ) zurueck ....
ALso die signatur so ner funktion sollte dann so aussehen :
int getSite(char * pBuffer, size_t * anz);
damit kann man solche funktionen mit dynamsichen und mit statischen speicher betreiben ....
So machens zumindest die meisten C libs ....
und dynamischer speicher ist neumodisches teufelszeug ^^ also C als sprache gibts laenger. Frueher hatte man sowas nicht und es gab nur quasi stackspeicher .... oder nen zeiger aufn speicherbereich den man halt verwenden konnte. den musst man sich dann selber halt einteilen.
Von daher kommt auch das hartnaeckige geruecht, das C um laengen
performanter sei als c++, was technisch eigentlich bloedsinn ist. C Programmierer sind von haus eher gewoehnt, speicher aggresiv als block zu allokieren, und den sich selber zu portionieren .... was wesentlich performanter, aber vom speicher selber her auch aufwendiger iss als was c++ biblios und programmer gern tun, speicher haepchenweisse immer dann zu allokieren, wenn sie ihn wirklich mal brauchen ....
merke malloc new und konsorten sind performance technisch schweineteuer !!!
Ciao ....
Lesezeichen