# Adressierten Speicher löschen C++



## Puepue (20. Juni 2010)

*Adressierten Speicher löschen C++*

Hallo zusammen,
habe ein Problem in meinem C++-Projekt.

Und zwar stürzt das Programm hier ab:

```
if(sVorgang.vtext != 0)
   {
		cout << "Leere Verschluesselungstext-Cache... ";
        delete []sVorgang.vtext;
		cout << "... erfolgreich!" << endl;    // Das hier wird nicht mehr ausgegeben
   }
```

sVorgang ist ein Struct:
TVerwaltung sVorgang = {0,true,false,0,0,0,0};


```
struct TVerwaltung
{
    int alg;
    bool einlesen;
	bool erzeugeKey;
    char * ktext;
    char * vtext;
    char * key;
    int ikey;
};
```

und vtext wird so erzeugt:


```
sVorgang.vtext = cryptonetimepad( sVorgang.ktext );
			sVorgang.key = 0;
```

So und hier noch die dazugehörige Funktion cryptonetimepad die ich gebastelt habe:

```
char * cryptonetimepad ( char * unverschluesselt )
{
	
	/* random Initialisierung */
	srand ( time(NULL) );

	char * longkey = new char[strlen(unverschluesselt)];
    char * verschluesselt = new char[strlen(unverschluesselt) + 3]; //+3 für Signatur

	/* Signatur */
	verschluesselt[0] = 'o';
	verschluesselt[1] = 't';
	verschluesselt[2] = 'p';


	int x = 3;	//Zähler ab Signatur
	cout << "Ihr Key lautet: " << endl;
	for ( int i = 0; i<strlen(unverschluesselt); i++ )
	{
		int key = rand()%2;
		if ( key == 1 )
        {
			key = 65 + rand()%(90-65+1);		// Key mit Großbuchstaben
		} 
		else
		{
			key = 97 + rand()%(122-97+1);		// Kleinbuchstabe für Key
		}
		longkey[i] = (char)key;
		
		verschluesselt[x] = unverschluesselt[i]^longkey[i];		// XOR
		cout << longkey[i];		// Key ausgeben
		//cout << verschluesselt[x] << " " << unverschluesselt[i] << " " << longkey[i] << endl;
		x++;
	}

	verschluesselt[x] = NULL;	// Tot dem Datenmüll!
	cout << endl;

	delete []longkey;
	return verschluesselt;
}
```

Ich finde den Fehler im Moment nicht - ist bestimmt nur was ganz blödes.. hat da jemand ne Idee?


----------



## Bauer87 (20. Juni 2010)

*AW: Adressierten Speicher löschen C++*

In C++ solltest du Speicher mit „Object * pointer = new Object();“ allozieren und mit „delete pointer; pointer = NULL;“ wieder freigeben.

Dinge wie „verschluesselt[x] = NULL“ solltest du tunlichst vermeiden. Zum einen ist verschluesselt[x] ein char und kein char*, zum anderen sollte man auch Pointer nur auf NULL setzen, wenn man direkt vorher das Objekt, auf das sie zeigen, gelöscht hat. Du wolltest wohl folgendes schreiben: „delete verschluesselt“, wobei das keinen Sinn ergibt, weil du es später wieder zurück gibst… Auch „delete []longkey“ ist etwas komisch. Das ist identisch „delete *longkey+0“, wobei longkey ja schon ein char* ist, somit löscht du einen char**, was keinen Sinn ergibt…

Dann erinnert dein C++ sehr an reines C: strlen(foo) und structs sollte man in C++ lieber nicht mehr verwenden. Statt c-strings und stucts wären in C++ std::string und generell Klassen besser. Damit könntest du statt „TVerwaltung sVorgang = {0,true,false,0,0,0,0};“ auch nen vernünftigen Constructor verwenden.


----------



## Puepue (20. Juni 2010)

*AW: Adressierten Speicher löschen C++*

mit dem = NULL
wollte ich die binäre Null ganz sicher ans Ende setzen.. 
Wenn ich stattdessen '\0' schreibe gehts auch nicht =(


----------



## Bauer87 (20. Juni 2010)

*AW: Adressierten Speicher löschen C++*

Schreib doch einfach „= 0“ oder „= '0'“, weil es ja ein char ist. Allerdings erschließt sich mit nicht ganz, warum du das überschreiben willst? Hast du angst, dass jemand in deinen Speicherbereich eindringt und die Zwischenprodukte ausliest?


----------



## boerigard (20. Juni 2010)

*AW: Adressierten Speicher löschen C++*

Ok. ich hab nicht so genau geschaut, ob das nun der alleinige Fehler ist. Aber mal sehen:
Der angeforderte Speicher für verschluesselt ist genau ein Zeichen zu kurz. Das sieht man gleich bei der new-Anforderung mit strlen. strlen gibt die Anzahl der Zeichen ohne die abschließende Null wieder.
Schlussendlich sieht es so aus, dass du deine Null in nicht angeforderten Speicher schreibst und beim Freigeben kommt es zum Knall.
Also pack noch eine + 1 bei deiner new-Anforderung dazu (new char[strlen(unverschluesselt) + 3 + 1]).

Noch ein, zwei Kleinigkeiten:
Du setzt ja in verschluesselt am Ende die Null mit NULL. Ok. schreib aber einfach 0. 

Weiter: Du hast es zwar schon richtig gemacht, nur noch mal zu Verdeutlichung:
Speicher den du mit new [] (Array-new) angefordert hast, musst du auch mit delete [] (Array-delete) wieder freigeben.
Bei einfachen Datentypen wie char ist es zwar im Grunde egal, falsch bleibt es trotzdem.


----------



## Puepue (21. Juni 2010)

*AW: Adressierten Speicher löschen C++*

ok das war der fehler 
vielen Dank


----------

