Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

HILFE!!! -- RiesenProblem...

greenhorn (Anonym) / 5 Antworten / Flachansicht Nickles

Zuerst einmal möchte ich wissen, welchen KOSTENLOSEN Compiler ihr mir empfehlen könnt... benutze im Moment djgpp.
Zum Problem: wenn ich in dem volgenden Source die Kommentarzeichen vor delete [] Inputstring1 wegmache, compile und ausführe, gibts nen Fehler.
Hier der Source: (ohne die Anführungszeichen und mit entsprechenden > und #include "iostream.h"
#include "conio.h"
#include "stdio.h"

void change(char *x);

void main(void)
{
char *Inputstring1 = new char[6];
Inputstring1 = "HALLO";
cout change(Inputstring1);
//delete [] Inputstring1;
}

void change(char *x)
{
cout }

Ich brauche dringend Hilfe!!!!
greets
greenhorn

bei Antwort benachrichtigen
andreas (Anonym) greenhorn (Anonym) „HILFE!!! -- RiesenProblem...“
Optionen

Moin, greenhorn!

Ich bin zwar nicht der grosse C++-Spezialist, aber was soll's. ;-)

Ich hab' der Stringbehandlung von C++ immer das Problem gehabt, dass ich durcheinander gekommen bin, mit der Zuweisungen einer Konstanten und dem Kopieren in den reservierten Speicher durcheinander gekommen bin.
In der Richtung liegt auch dein Problem...

OK. Es läuft, wenn die delete-Anweisung nicht da ist, also kein Speicher freigegeben wird.

Was macht dein Program?
- Es deklariert einen Stringzeiger UND weist ihm Speicherplatz zu
- Es weist dem Stringzeiger einen neuen Speicherbreich zu (mit vorbelegtem Textinhalt = dem
Zeiger zeigt nun auf die Stringkonstante mit dem Inhalt "HALLO").
- Es gibt den Inhalt des zugewiesenen Speichers als String aus.
- //Es gibt den zugewiesenen Speicher wieder frei.

Der Fehler dürfte die zweite Zuweisung sein. Was du machen wolltest ;-)
ist den vorher reservierten Speicher mit dem Text "HALLO" belegen.
Dazu musst du aber den neuen Inhalt ("HALLO") in den reservierten Speicher kopieren (mit STRCPY, wenn ich mich nicht irre).

OK. Zum Fehler:
Der Fehler wird jetzt durch eine Zugriffverletzung verursacht. Die String-Konstante liegt in einem Speicherbreich, der nicht vom Programm beschrieben werden darf. Mit der DELETE-Anweisung wird aber genau das vorbereitet (der Speicher wird wieder freigegeben, damit er vom Programm neu beschrieben werden kann).
Und dieser Speicherbreich wurde dem Stringzeiger zugewiesen und soll nun freigegeben werden. Darüber stolpert dann die CPU zur Laufzeit und beschwert sich.

Ich hoffe, das hilft dir weiter.

Bis denn
Andreas

bei Antwort benachrichtigen