Frage

Freunde

In unserem C ++, Iam aktuellen realloc Verfahren unter Verwendung des Speichers durch malloc zu ändern. realloc () Verwendung erfolgt wie unter

my_Struct *strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

strPtr = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);

Jetzt Wikipeadias (_http: //en.wikipedia.org/wiki/Malloc) sagt, dass

Wenn stattdessen tut

void *p = malloc(orig_size);

/* and later... */

p = realloc(p, big_size);

dann, falls es nicht möglich ist big_size Byte Speicher zu erhalten, p wird Wert NULL hat, und wir haben nicht mehr einen Zeiger auf den Speicher vorher für p zugeordnet, ein Speicherleck zu schaffen

Und er sagt auch, dass der richtige Weg, um den oben genannten Fehler ist

zu korrigieren
void *p = malloc(orig_size);

/* and later... */

void *tmp = realloc(p, big_size); 

if (tmp != NULL)
 {

p = tmp; /* OK, assign new, larger storage to p */

} 

else 

{

/* handle the problem somehow */

}

Können Sie mir sagen, welche die beste Art und Weise ist realloc () zu verwenden

Auch wenn ich Zeiger auf eine Struktur haben, und dann bei der Verwendung von realloc später kann ich mit Zeiger auf eine Lücke ???

Vielen Dank

War es hilfreich?

Lösung

Natürlich müssen Sie gegen den Fall schützen, die Erträge realloc() NULL. Es ist eine Speicherzuordnung, und in C (wo realloc()) meist verwendet wird, denke ich, C ++ Programmierer denken, es ist ein bisschen Low-Level / qaint ist roh realloc() Anrufe verwenden, können Zuweisungen Speicher immer fehlschlagen.

Direkt den Zeiger mit dem Rückgabewert überschrieben wird ein Fehler vorliegt, so dass die ursprünglichen Zeiger fällt und macht den Speicherverlust, falls die Neuzuweisung fehlgeschlagen.

Andere Tipps

Malloc () und realloc () sind C-Funktionen. Eigentlich realloc () macht malloc () und free (), je nach Argumenten, die Sie übergeben:

  • Wenn Sie es einen Null-Zeiger übergeben, realloc tut, was malloc der Fall ist.
  • Wenn Sie eine Größe Null passieren, realloc tut, was frei macht.

Zitat von Hier , in dem Sie eine tiefere Erklärung.

Die C-Bibliothek macht es unmöglich, einen Speicherblock an seinem Platz zu erweitern, so C ++ ist es auch nicht unterstützen.

Wenn Sie C-Funktionen halten wollen, dann sollten Sie den Zeiger Ihrer ersten Speicherzuweisung halten, wenn realloc () aufrufen. Dann sind Sie zu überprüfen, ob es NULL ist, ansonsten weisen Sie es, wie Sie es in Ihrem latst Code haben.

Aber vielleicht für C ++ ist die beste Lösung Ihre eigene mallocator, die std Lösung malloc auf Basis von C zu machen (). Überprüfen Sie dieses oder diese .

Mit dem vorgeschlagenen Ansatz - halten Sie den Zeiger auf den vorherigen Puffer, bis realloc erfolgreich zurückgekehrt ist. Sobald realloc () erfolgreich der vorherige Block zurückkehrt freigegeben wurde und alle Zeiger auf sie haben baumelnden werden -. Sie anpassen

realloc sowie malloc egal, was der Zeigertyp ist -. Sie * sowie alles * Leere verwenden

Wie schon andere gesagt haben, nur richtig verwenden realloc wie vorgeschlagen.

Aber die „C ++ Art und Weise“, dies zu tun ist wirklich einen std :: vector zu verwenden <> anstatt Arrays selbst zu halten. Auf diese Weise der C ++ Standard-Bibliothek kümmert sich um die Low-Level-Details der Neuzuteilung nehmen (vermutlich durch realloc () verwendet).

Wenn realloc () fehlschlägt und gibt NULL zurück den ursprünglichen Speicher ist unberührt.
So können Sie es wie folgt verwenden sollte:

my_Struct* strPtr =(my_struct*)malloc(sizeof(my_Struct));

/* an later */

my_Struct* tmp = (my_struct*)realloc(strPtr,sizeof(my_Struct)*NBR);
if (tmp != NULL)
{
    strPtr = tmp;
}
else
{
    /* realloc Failed. Need to do something */
}

Warum verwenden Sie malloc und realloc? Es gibt fast immer eine bessere Art und Weise in C ++.

Wenn Sie es verwenden Arrays variabler Länge zu machen, sind Sie fast sicher besser dran mit std :: vector <>, oder vielleicht einer der anderen Container-Vorlagen.

Wenn Sie C stattdessen verwenden, vielleicht mit einem C ++ -. Fähig Compiler, dann ist der richtige Weg ist, die zweite Methode, die nicht einen ganzen Speicherblock nicht verliert, wenn es zuzuteilen nicht

Die Antwort auf Ihre zweite Frage hängt auch davon ab, ob Sie C oder C ++ verwenden. In C, void * ist ein generischer Datenzeigertyp, und ist frei konvertierbar. In C ++ muss void * explizit konvertiert werden. Wenn Sie tatsächlich C zu schreiben, müssen Sie malloc () und Freunde verwenden, die Arbeit auf void *. Wenn Sie wirklich C ++ zu schreiben, müssen Sie werfen, was macht es umständlich. In keinem Fall realloc () Arbeit auf Zeiger tut auf struct, sondern Zeiger für ungültig zu erklären.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top