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

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

11

07.03.2007, 15:38

Zitat von »"helium"«

Ein Pointer/Zeiger ist ein Verweis irgendwo hin. Er kann nur auf schon existierende Objekte zeigen.
Das ist nicht ganz richtig. Eine Referenz muss ein existierendes Objekt referenzieren. Ein Zeiger dagegen nicht (Zum Beispiel zeigt der Nullzeiger nie auf ein existierendes Objekt).

Zitat von »"helium"«

C-/C++-Quelltext

1
    Foo * verweis = objekt1;  // "verweis" zeigt nun auf objekt1.
Da fehlt ein &

C-/C++-Quelltext

1
    Foo * verweis = &objekt1;  // "verweis" zeigt nun auf objekt1.

Zitat von »"helium"«

C-/C++-Quelltext

1
2
3
4
Foo * erzeugeEinFoo () 
{ 
    return new Foo(); 
}
Dazu sollte man noch sagen dass sowas sehr gefährlich sein kann, da man das zurückgelieferte Objekt mit delete zerstören muss und dies ist nicht so offensichtlich wenn man so eine Funktion aufruft. Deswegen stürzt das Programm zwar nicht ab aber Ressourcenlecks sollte man trotzdem nicht auf die leichte Schulter nehmen.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

07.03.2007, 19:09

Zitat von »"helium"«


Statische Instanzierung sieht so aus:


Wie kommst du nochmal auf statisch?

Zitat von »"helium"«


new Foo() legt irgendwo ein Objekt an, also eine Instanz des Typs Foo.


Ned irgendwo, sondern auf dem Heap. Das sollte wohl durchaus erwähnt werden.

Zitat von »"helium"«


C-/C++-Quelltext

1
2
3
4
5
Foo * erzeugeEinFoo ()
{
   Foo * temp = new Foo();
   return temp;
}


C-/C++-Quelltext

1
2
3
4
Foo * erzeugeEinFoo ()
{
   return new Foo();
}



Sowas ist natürlich hochgefährlich. Da die Freigabe des reservierten Speichers nich garantiert ist. Sowas sollte also lieber vermieden werden, oder durch eine gute Lösung ersetzt werden.

Zitat von »"big_muff"«


Das ist nicht ganz richtig. Eine Referenz muss ein existierendes Objekt referenzieren. Ein Zeiger dagegen nicht (Zum Beispiel zeigt der Nullzeiger nie auf ein existierendes Objekt).


Und was ist damit?

C-/C++-Quelltext

1
2
foo* p = NULL;
foo& ref = *p;


*hust* das war natürlich nur ein Scherz. Bitte, bitte meidet jegliche Art von Lebewesen die so einen Unsinn tatsächlich, gewollt fabrizieren! ;)

Aaaalso... Wo war ich? Achja... Wenn man nich unter enormer Resourcenknappheit leidet lohnen sich meist Smartpointer. Das sind Objekte die intern einen Zeiger auf ein gewünschtes Objekt halten und sich auch in der Handhabung genau wie zeiger verhalten.

Das nette an Smartpointern ist aber das man die Art, Zeit und das Verhalten der Speicherfreigabe selbst bestimmen kann, bzw festlegen kann. Das bedeutet, ein Smartpointer kann den Speicher im Destruktor freigeben. Da ein Smartpointer ein Objekt auf dem Stack ist wird dieses Objekt natürlich schön beim verlassen eines Gültigkeitsbereichs zerstört. D.h. der Destruktor wird aufgerufen und der Speicher auf dem Heap freigegeben.

C-/C++-Quelltext

1
2
3
4
5
6
7
std::auto_ptr< foo > bla()
{
   return std::auto_ptr< foo >( new foo );
}

// ...

std::auto_ptr< foo > blubb = bla();


Und tataaaaa, schon hat man keinen Stress mehr mit dem korrekten Freigeben des Speichers (das passiert sogar im Falle einer Exception) und das Kopieren des Objekts dauert auch nich lang, weil der Smartpointer normal nur flach kopiert wird.

Viele grüße
@D13_Dreinig

13

07.03.2007, 20:18

Die Pointer-Arithmetik habe ich schon verstanden, mich hatte nur diese Schreibweise bei Allegro verwirrt. :oops:
Sprachen: C/C++, C#, Assembler (16-Bit), QuickBASIC

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

08.03.2007, 07:31

Zitat von »"Reboot"«

Die Pointer-Arithmetik habe ich schon verstanden, mich hatte nur diese Schreibweise bei Allegro verwirrt. :oops:


Das Objekt wird dann in der Funktion selbst aufgerufen. Eine besonders gute/sichere Lösung ist das aber nicht.
@D13_Dreinig

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

15

08.03.2007, 11:05

Warum soll das keine gute Lösung sein?
Schlag was besseres (in C) vor!

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

16

08.03.2007, 11:34

Zitat von »"Chase"«

Zitat von »"helium"«

aus:

C-/C++-Quelltext

1
2
3
4
   Foo objekt1;
   Foo objekt2;
  
   Foo * verweis = objekt1;  // "verweis" zeigt nun auf objekt1.


Bitte was ? Schon mal das Zeichen & gesehen ??
Foo &ref = objekt1;
oder
Foo *pnt = &objekt1;

Bitte pass auf wenn du was erklaerst!

Sorry, sowas kann ja wohl mal passieren. Meine Fresse.
Habs editiert
Why is 6 afraid of 7?
Because 7 8 9

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

17

08.03.2007, 11:40

Zitat von »"big_muff"«

Zitat von »"helium"«

Ein Pointer/Zeiger ist ein Verweis irgendwo hin. Er kann nur auf schon existierende Objekte zeigen.
Das ist nicht ganz richtig. Eine Referenz muss ein existierendes Objekt referenzieren. Ein Zeiger dagegen nicht (Zum Beispiel zeigt der Nullzeiger nie auf ein existierendes Objekt).

Null-Zeiger hätte ich erwähnen können, korrekt und Dangling-Pointer meinetwegen auch. Das war aber nicht Teil des Problems.

Zitat von »"big_muff"«


Zitat von »"helium"«

C-/C++-Quelltext

1
    Foo * verweis = objekt1;  // "verweis" zeigt nun auf objekt1.
Da fehlt ein &

C-/C++-Quelltext

1
    Foo * verweis = &objekt1;  // "verweis" zeigt nun auf objekt1.

Zitat von »"helium"«

C-/C++-Quelltext

1
2
3
4
Foo * erzeugeEinFoo () 
{ 
    return new Foo(); 
}
Dazu sollte man noch sagen dass sowas sehr gefährlich sein kann, da man das zurückgelieferte Objekt mit delete zerstören muss und dies ist nicht so offensichtlich wenn man so eine Funktion aufruft. Deswegen stürzt das Programm zwar nicht ab aber Ressourcenlecks sollte man trotzdem nicht auf die leichte Schulter nehmen.

Ich hätte auch noch Smartpointer erklären und ein kleines Tutorial verfassen können, dass beschreibt, wie man diverse GC für C++ verwendet. Wollte ich aber alles nicht.
Why is 6 afraid of 7?
Because 7 8 9

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

18

08.03.2007, 11:49

Zitat von »"David_pb"«

Zitat von »"helium"«


Statische Instanzierung sieht so aus:


Wie kommst du nochmal auf statisch?

OK, hast recht, war eine doofe Wortwahl. Hier: statisch im gegensatz zu dynamisch (new/malloc/...).


Zitat von »"David_pb"«


Zitat von »"helium"«


new Foo() legt irgendwo ein Objekt an, also eine Instanz des Typs Foo.


Ned irgendwo, sondern auf dem Heap. Das sollte wohl durchaus erwähnt werden.

Weil?

Zitat von »"David_pb"«


Zitat von »"helium"«


C-/C++-Quelltext

1
2
3
4
5
Foo * erzeugeEinFoo ()
{
   Foo * temp = new Foo();
   return temp;
}


C-/C++-Quelltext

1
2
3
4
Foo * erzeugeEinFoo ()
{
   return new Foo();
}



Sowas ist natürlich hochgefährlich. Da die Freigabe des reservierten Speichers nich garantiert ist. Sowas sollte also lieber vermieden werden, oder durch eine gute Lösung ersetzt werden.

Ja, beim nächstenmal packe ich auch noch ein Kapitel über Exception Safety dazu. :roll:


Zitat von »"David_pb"«


Zitat von »"big_muff"«


Das ist nicht ganz richtig. Eine Referenz muss ein existierendes Objekt referenzieren. Ein Zeiger dagegen nicht (Zum Beispiel zeigt der Nullzeiger nie auf ein existierendes Objekt).


Und was ist damit?

C-/C++-Quelltext

1
2
foo* p = NULL;
foo& ref = *p;


*hust* das war natürlich nur ein Scherz. Bitte, bitte meidet jegliche Art von Lebewesen die so einen Unsinn tatsächlich, gewollt fabrizieren! ;)

Du dereferenzierst einen Nullpointer. Der Ausdruck *p verursacht undefiniertes Verhalten, wenn p==0.


Zitat von »"David_pb"«


Aaaalso... Wo war ich? Achja... Wenn man nich unter enormer Resourcenknappheit leidet lohnen sich meist Smartpointer. Das sind Objekte die intern einen Zeiger auf ein gewünschtes Objekt halten und sich auch in der Handhabung genau wie zeiger verhalten.

std::auto_ptr z.B. verhält sich nicht genau wie ein Zeiger (Besitztransfer)!
Why is 6 afraid of 7?
Because 7 8 9

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

19

08.03.2007, 11:56

Zitat von »"Reboot"«

Die Pointer-Arithmetik habe ich schon verstanden, mich hatte nur diese Schreibweise bei Allegro verwirrt.

Die Schreibweise? Was daran?

Deine Fragen waren:

Zitat von »"Reboot"«


Also es gibt da ne Klasse BITMAP und ich setze immer einen Pointer auf BITMAP. Aber ich Instanziere BITMAP nie, warum?
[...]
Warum instanziert man im folgenden Fall nicht einfach BITMAP?

War die Frage, warum "LoadBitmap (blablabla)" anstelle von z.B. "new BITMAP(blablabla)"?
Why is 6 afraid of 7?
Because 7 8 9

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

20

08.03.2007, 12:06

Zitat von »"helium"«

War die Frage, warum "LoadBitmap (blablabla)" anstelle von z.B. "new BITMAP(blablabla)"?

Weil Allegro eine C-Library ist. LoadBitmap kann man als Konstruktor ansehen.

Werbeanzeige