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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

14.03.2007, 11:38

eine frage zu pointern

ähm ja .. diese frage wird jetzt etwas komisch klingen weil ich es wohl wissen sollte, aber..

wenn ich einen pointer mit new instanziere muss ich ihn mit delete freigeben.. ist klar..

C-/C++-Quelltext

1
2
3
4
int *pointer = new int;

delete pointer;
pointer = NULL;


aber wie ist das bei pointern für die ich keinen zusätzlichen speicher reserviere, sondern die nur irgendwohin zeigen.. muss ich die, sobald ich sie nicht mehr brauche NULLen?

also zb ich hab ein handle auf ein fenster, und wenn das programm beendet wird, muss ich dann zb dieses handle NULLen, oder ist das egal?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

14.03.2007, 11:52

Nein, das musst du natürlich nicht.
Es ist aber "sicherer", einen Pointer auf 0 zu setzen, wenn das Objekt dahinter gelöscht wurde, damit man nicht mehr irrtümlich versuchen kann darauf zuzugreifen oder das Objekt ein zweites Mal zu löschen.

Übrigens. "Einen Pointer instanzieren" ist nicht die richtige Ausdrucksweise für das, was du meinst.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

3

14.03.2007, 12:52

Nur mal so am Rande: das NULLen eines Zeigers, den man nicht mehr braucht, oder den es nicht mehr gibt, ist zwar "good style", rettet einen aber nicht in allen Fällen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ShareInt
{
public:
  void chewOnInt (int* external_pointer)
  {
    _chew_pointer = external_pointer;
  }

private:

  int* _chew_pointer;
};

void foo (ShareInt* parasite)
{
  int* int_ptr = new int (10);
  parasite->chewOnInt (int_ptr);
  delete int_ptr;
  int_ptr = 0;
}


Das ist jetzt zwar brutal vereinfacht, aber die Idee hinter dem Problem sollte klar werden. Wenn ich einen Zeiger auf ein Objekt an mehreren Stellen hinterlege, muss ich eben doch selbst aufpassen, ihn auch überall wieder rauszuwerfen, wenn ich das Objekt entferne.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

15.03.2007, 20:35

Tja, um so kleine Dummheiten zu vermeiden gibts Smartpointer! :-)
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

5

15.03.2007, 20:45

Zitat von »"rklaffehn"«


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ShareInt
{
public:
  void chewOnInt (int* external_pointer)
  {
    _chew_pointer = external_pointer;
  }

private:

  int* _chew_pointer;
};

void foo (ShareInt* parasite)
{
  int* int_ptr = new int (10);
  parasite->chewOnInt (int_ptr);
  delete int_ptr;
  int_ptr = 0; // <---

}



die letzte zeile da.. soll das das NULLen sein? oder eine wertzuweisung? O_o

C-/C++-Quelltext

1
2
3
4
5
        // entweder

    *int_ptr = 0;
        // oder

    int_ptr = NULL;
        // oder irre ich mich jetz ..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

15.03.2007, 20:52

Statt NULL einfach 0 schreiben. Damit wird der Pointer "genullt" also ein Nullpointer. Is beides der gleiche Effekt!

Aber 0 zu schreiben, statt NULL ist mehr C++ like! ;)

Aus windef.h

C-/C++-Quelltext

1
#define NULL    0
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

7

15.03.2007, 21:14

jaja is schon klar, ich war mir nur nicht sicher, weil die meisten gebrauchen trotzdem noch das NULL weils lesbarer ist.. also ich persönlich zumindest ^^

das beispiel soll zeigen, dass solange ein pointer noch auf den speicher zeigt, man mit der variable noch immer was machen kann d.h. der speicher nicht freigegeben ist richtig?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

15.03.2007, 21:20

Nein, falsch! Das Beispiel soll zeigen dass das Nullsetzen eines Zeigers, nach der Freigabe vom Speicher, keine Sicherheitsgarantie ist. Da ja andere Zeiger ebenfalls auf das Speicherstück zeigen können, diese jedoch nichts von der Freigabe und dem Nullsetzen des Zeigers mitbekommen.

Das Problem dass daraus entsteht ist, das man versuchen kann einen (vermeindlich) funktionsfähigen Zeiger zur Speicherfreigabe zu nutzen, oder diesen Zeiger dereferenziert, oder oder oder... Das Programmverhalten ist dann nie voraussehbar.

Umgehen lässt sich das, wie bereits gesagt, mit Smartpointern! :)
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

9

15.03.2007, 21:27

achso .. ^^ aja an das hab ich gar nicht gedacht (verdammt) :lol:
is aber logisch, und ich kann mir vorstellen dass das recht shice ist, wenn man dann mit dem anderen pointer, der noch auf den speicherbereich zeigt, was machen will :D
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

15.03.2007, 21:38

Tja, dumme Sache das.

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
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <boost/shared_ptr.hpp>

class foo
{
public:
    typedef boost::shared_ptr< int > ptr_type;

private:
    ptr_type ptr;

public:
    void setPointee( const ptr_type& p )
    {
        ptr = p;
    }

    void doSomething() const
    {
        std::cout << "Value: " << *ptr << std::endl;
    }
};

void foobar( foo& dest )
{
    foo::ptr_type p( new int( 10 ) );
    dest.setPointee( p );
} // p wird korrekt geloescht da aber foo::ptr noch auf den Speicher zeigt wird dieser nicht freigegeben


int main()
{
    foo bar;

    foobar( bar );
    bar.doSomething(); // Jep, klappt. Der Speicher existiert noch!

} // bar wird geloescht und damit auch der Speicher freigegeben, da keine Instanz mehr auf den Speicher zeigt


Tataaa, schon hat man keine Probleme mehr. Kein Nullsetzen notwendig, keine Speicherfreigabe notwendig, keine Sorgen wegen vagabundierenden Zeigern, alles wunderbar!
@D13_Dreinig

Werbeanzeige