Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

11.02.2012, 15:59

C++ Zeiger Problem

Hallo Leute ich habe ein Zeiger Problem und zwar:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*
    C++_POINTER
*/

#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
    int *iZahl = new int; 

    *iZahl = 2342; //Zeiger einen Wert geben

    cout << "Heap-Adresse: " << iZahl << endl; //Adresse des Zeigers ausgeben
    cout << "Wert: " << *iZahl << endl; //Wert des Zeigers ausgeben

    delete iZahl; //Wer des Zeigers löschen

    cout << "Heap-Adresse: " << iZahl << endl; 
    cout << "Wert: " << *iZahl << endl;


    getch();
}


Nachdem ich

C-/C++-Quelltext

1
delete iZahl;
gemacht habe und den Wert wieder angucken möchte ob er wirklich Gelöscht wurde steht in der Konsole

Quellcode

1
2
3
4
Heap-Adresse: 00494910
Wert: 2342
Heap-Adresse: 00494910
Wert: -17891602


Heißt -17891602 das es Gelöscht ist?

FSA

Community-Fossil

  • Private Nachricht senden

2

11.02.2012, 16:03

Wenn ich mich nicht irre, dann ja. Denn du löschst ja nur den Speicher nicht aber die Adresse. Dann müsstest du noch iZahl=Null schreiben.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

11.02.2012, 16:21

Ich möcht auch bloß den Wert des Zeigers löschen!

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

11.02.2012, 16:22

Die Debug-Runtime von Visual Studio meine ich überschreibt Speicher, der freigegben wird mit einem Muster.
Kann gut sein, dass es bei anderne Compilern ebenso ist.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

5

11.02.2012, 16:30

Also ist das -17.... in wirklichkeit 0(NULL)?

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

11.02.2012, 17:37

Es ist undefiniert was nach dem Delete noch in dem Speicherbereich steht. Eigentlich darfst du da auch gar nicht mehr reingucken. Dein Programm könnte an der Stelle genau so gut wegen einer Zugriffsverletzung beendet werden.

7

11.02.2012, 17:42

Es ist auch nicht definiert, was durch ein delete mit dem Wert des Pointers (also der Speicheradresse) passiert. In der Regel bleibt der Wert unverändert. delete macht aus einem Pointer also keinen Nullpointer. Es ist aber empfehlenswert, diesen Schritt manuell vorzunehmen, da ansonsten ein Dangling Pointer entsteht.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

8

11.02.2012, 22:32

Also ist das -17.... in wirklichkeit 0(NULL)?
Nein. Ich weiß nicht mehr auswendig wie das Muster war, aber 0 war es nicht. Eher sowas in der Art wie 0xEDEDEDED.
Im Allgemein gilt aber auch, was hier schon geschrieben wurde: Man sollte da nicht mehr reingucken. Und wenn man es doch tut, sollte man tunlichst keine bestimmten Muster oder den alten Wert erwarten.

Ich meine die Releaseruntime lässt den alten Wert drin - wozu Zeit verschwenden den mit etwas anderem zu überschreiben? Der bleibt aber nur solange da, bis der Speicherblock nicht auch wirklich an das OS zurück übergeben worden ist.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

12.02.2012, 11:36

Ich möcht auch bloß den Wert des Zeigers löschen!

hmm. Weißt du überhaupt was new und delete machen?
Was verstehst du unter löschen?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

10

12.02.2012, 14:27

Wenn du genau wissen willst, wie malloc bzw. der new-Operator funktionieren, kann ich dir diesen Artikel mit einer Beispielimplementierung der malloc-Funktion empfehlen: http://www.ibm.com/developerworks/linux/library/l-memory/ (Ich gehe hier einfach mal davon aus, dass der new-Operator die malloc-Funktion nutzt, was natürlich nicht vorgeschrieben ist.)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »GreenPepper« (12.02.2012, 15:21)


Werbeanzeige