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

11

23.05.2008, 13:47

1) Kann mir mal wer erklaeren, warum "malloc" anstatt "new" bei Klassen benutzt wird? Gerade bei der Speicherverwaltung sollte man bei "new" bleiben, wenn man in C++ arbeitet. An anderer Stelle habe ich das schon mal erwaehnt: Es gibt einen Grund dafuer!

2) Zu folgendem sei zu sagen: Wenn man das Objekt loescht, so sollte danach der Zeiger auch auf 0 gesetzt werden. Denn ein erneutes Freigeben wuerde zum Absturz fuehren.

Quellcode

1
2
if(pPlayer) // total unnötig, da delete auf einen 0-Zeiger sicher ist
  delete pPlayer;


Quellcode

1
pPlayer = 0;

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

23.05.2008, 13:52

Zitat von »"knivil"«

1) Kann mir mal wer erklaeren, warum "malloc" anstatt "new" bei Klassen benutzt wird? Gerade bei der Speicherverwaltung sollte man bei "new" bleiben, wenn man in C++ arbeitet. An anderer Stelle habe ich das schon mal erwaehnt: Es gibt einen Grund dafuer!


Im Allgemeinen hast du recht. Aber der new[]-Operator streikt wenn dein Objekttyp keinen Standardkonstruktor hat.

Zitat von »"knivil"«


2) Zu folgendem sei zu sagen: Wenn man das Objekt loescht, so sollte danach der Zeiger auch auf 0 gesetzt werden. Denn ein erneutes Freigeben wuerde zum Absturz fuehren.

Quellcode

1
2
if(pPlayer) // total unnötig, da delete auf einen 0-Zeiger sicher ist
  delete pPlayer;


Quellcode

1
pPlayer = 0;


Sollte die gefahr bestehen ist das durchaus Sinnvoll. Aber das Problem ist ja nicht immer vorhanden. Das Nullsetzen eines Zeigers in einem Destruktor macht z.B., im Allgemeinen, keinen wirklichen Sinn.
@D13_Dreinig

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

13

23.05.2008, 14:51

Zitat von »"David_pb"«

for ( unsigned i = 0; i < 100; ++i )
new ( &i[ p ] ) CRaumschiff( parameter ... );

:D
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

23.05.2008, 15:03

Zitat von »"tnecniv"«

Zitat von »"David_pb"«

for ( unsigned i = 0; i < 100; ++i )
new ( &i[ p ] ) CRaumschiff( parameter ... );

:D


Hm? Stimmt doch? :)
@D13_Dreinig

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

15

23.05.2008, 15:15

manno, gar nich
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

23.05.2008, 15:18

Zitat von »"tnecniv"«

manno, gar nich


Doch ist es in dem Fall, wenn es auch unintuitiv aussieht. [] ist eine kommutative Operation sofern der [] operator nicht überschrieben ist.

C-/C++-Quelltext

1
new ( &i[ p ] ) CRaumschiff( parameter ... );


Wär das gleiche wie:

C-/C++-Quelltext

1
new (&p[i]) CRaumschiff(parameter ...);


wobei man sowieso auch einfach

C-/C++-Quelltext

1
new (p + i) CRaumschiff(parameter ...);


schreiben und anstatt unsigned int evtl. size_t verwenden hätte können...

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

17

23.05.2008, 15:46

wow, das hät ich absolut nicht gedacht. aber andersrum ist es verständlicher.. :) danke für das extrawissen

p.s. und bestimmt wars auch andersrum gemeint, oder? gibs zu... :D
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

23.05.2008, 15:54

Nö, war genau so gemeint wie geschrieben. Warum? Um anderen Extrawissen zu verschaffen! :p
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

23.05.2008, 15:54

der standard definiert das verhalten von a als gleichbedeutend mit *(a + b).
da a + b das gleiche ist wie b + a folgt daraus direkt dass a[b] das gleiche ist wie b[a]...

aber gut, die "verkehrte" schreibweise funktioniert nur bedingt und ich seh jetzt eigentlich keinen besondren sinn dahinter es in solchen fällen anders herum zu schreiben. vor allem nicht wenn es darum geht, jemandem der offensichtlich gerade erst am anfang steht etwas zu erklären...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

23.05.2008, 15:57

Zitat von »"dot"«

der standard definiert das verhalten von a als gleichbedeutend mit *(a + b).
da a + b das gleiche ist wie b + a folgt daraus direkt dass a[b] das gleiche ist wie b[a]...


Anmerkung:
Dazu ist noch zu erwähnen das die meisten Compiler den Zugriff über den Index Operator besser optimieren können als die Zeigerschreibweise!
@D13_Dreinig

Werbeanzeige