Frage

Ich bin relativ unerfahrene, wenn es darum geht, C ++, wie ich auf Java für viel von meinem Bachelor-Lehrplan weened wurde (tis eine Schande). Die Speicherverwaltung ist ein Streit, aber ich habe eine Reihe Bücher über ANSI C und C ++ erworben. Ich habe um die damit verbundenen Fragen stieß, konnte aber nicht einen finden, der diese besondere Kriterien abgestimmt. Vielleicht ist es so offensichtlich niemand erwähnt es?

Diese Frage wurde mir nervt, aber ich fühle mich, als ob es ein konzeptioneller Punkt ist die Verwendung ich nicht.

Nehmen wir an:

char original[56];
cstr[0] = 'a';
cstr[1] = 'b';
cstr[2] = 'c';
cstr[3] = 'd';
cstr[4] = 'e';
cstr[5] = '\0';
char *shaved = shavecstr(cstr); 
// various operations, calls //
delete[] shaved;

Wo

char* shavecstr(char* cstr) 
{
    size_t len = strlen(cstr);
    char* ncstr = new char[len];
    strcpy(ncstr,cstr);
    return ncstr;
}

, dass der ganze Punkt ist ‚Original‘ zu haben, ein Puffer sein, dass Füllungen mit Zeichen und routinemäßig seine Kopie rasierten und anderswo verwendet.

Um zu klären, Original wird über std::gets(char* buff), std::getline(char* buff, buff_sz), std::read(char* buff, buff_sz) gefüllt, oder jeden an Ort und Stelle Füllung Eingangsleser. Um ‚shave‘ eine Zeichenfolge, ist es im Grunde abgeschnitten Sie die nicht verwendeten Array Raum zu beseitigen.

Der Fehler ist ein Heap-Zuordnungsfehler und segs auf dem delete[].

Um zu verhindern, undichte Stellen, ich möchte den Speicher freizugeben gehalten von ‚rasiert‘ wieder verwendet werden, nachdem es einige Argumente durchläuft. Es ist wahrscheinlich ein guter Grund dafür, warum diese beschränkt ist, sondern es sollte eine gewisse Art und Weise sein, den Speicher als durch diese Konfiguration zu befreien, gibt es keine Möglichkeit, den Zugang der ursprüngliche Besitzer (Zeiger) der Daten.

War es hilfreich?

Lösung

Ich nehme an, Sie original durch cstr ersetzen würde, sonst wird der Code nicht kompilieren als cstr nicht deklariert ist.

Der Fehler ist, dass die Größe des zugewiesenen Array zu klein ist. Sie wollen char* ncstr = new char[len+1]; zu Konto für den Abschluss \0.

Auch wenn Sie shaved direkt nach dem die Funktion zurückkehrt löschen, gibt es keinen Punkt in dem Aufruf der Funktion ...

[*] Um ein bisschen tiefer zu gehen, der Speicher für cstr verwendet wird freigegeben, wenn die Funktion zurückkehrt enthält. Normalerweise sind solche statische Strings werden in Konstanten gesetzt, die für die gesamte Dauer der Anwendung leben. Zum Beispiel könnten Sie const char* cstr="abcde"; außerhalb alle Funktionen haben. Dann können Sie diese Zeichenfolge übergeben um ohne dynamisch es zuweisen zu müssen.

Andere Tipps

Angenommen, Sie zu verwenden cstr gemeint statt cstrn ...

Sie sollten nicht cstr werden zu löschen. Sie sollten löschen shaved werden.

Sie delete nur den Speicher, der mit new zugeordnet wurde. Und delete[] Speicher, der mit new[] zugeordnet wurde.

shaved ist einfach eine Variable, die eine Speicheradresse enthält. Sie passieren, dass Speicheradresse delete[] rid des Speichers zu erhalten. shaved hält die Speicheradresse des Speichers, der mit new[] zugeordnet wurde.

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