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

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

1

10.07.2010, 06:02

Speicherinhalt löschen ohne ihn freizugeben

hey leute ...

ich habe im moment ein kleines problem mit der speicherfreigabe in meinem projekt ... ich arbeite mit einem dynamisch wachsenden array ...



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
#pragma once 
#include <iostream> 
#include "TArray.h" 
#include "TBase.h" 
#include "_eTypes.h" 
using namespace std; 
template<class TDerived>class TList : public TArray<TDerived> 
{ 
//vars 
protected: long long int _topMost; 
//Ctr 
public: TList(); 
public: TList(const TList&); 
public: TList(long long int min_capacity); 
public: inline TList& operator=(const TList&); 
public: bool operator==(const TList&); 
public: bool operator!=(const TList&);
public: 
TDerived& operator[](const long long int index); 
//destr 
public: ~TList(void); 
public: long long int size(void)const; 
protected: int capacity(void)const; 
public: TDerived& insert(TDerived); 
public: TDerived& get(long long int i); 
public: bool erase(long long int i); 
public: void clear(void); 
public: TList& invers(void); 
public: TDerived _popTop(void); 
public: TDerived _popFront(void); 
private: void expand(void); 
private: void _swap(TDerived* a, TDerived* b); 
private: bool _swapRange(long long int start,long long int end);protected: bool _validValue(long long int i); 
};




C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template<class TDerived>bool TList<TDerived>::erase(long long int i) 
{ 
if(this->_validValue(i)) 
{ 
for(long long int x = i; x < this->size()-1;x++) 
{ 
*((TDerived*)this->_member[x])->~TDerived(); 
this->_member[x] = this->_member[x+1]; 

//TDerived tmp = this->_member[x]; 
//this->_member[x] = this->_member[x+1]; 
//this->_member[x+1] = tmp; 

} 
this->_topMost--;return true; 
} 
return false; 
}



nun möchte ich das wenn mit erase eine zelle gelöscht werden soll auch deren inhalt gelöscht wird ... also sollte sich darin ein pointer befinden möchte ich das der inhalt wie mittels delete freigegen oder irgentwie gelöscht wird ... so das der destructor aufgerufen wird ... nur habe ich kein schimmer wie ich das machen soll und meine bisherigen versuche funktionieren nicht ... hat einer von euch evlt eine idee ?


danke für eure hilfe im voraus:)
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

10.07.2010, 08:43

Möchtest du jetzt den Pointer oder den Inhalt eines Elements löschen? Wenn du den Zeiger löschst, kannst du ja auf den Inhalt auch nicht mehr zugreifen, also ist er doch auch gelöscht?! Wenn du meinst, dass du den Speicher löschen und freigeben möchtest, um sicherzustellen, dass nichts mehr im Speicher verbleibt, benutze die Funktion ZeroMemory() und gebe den Speicher danach mittels delete frei. Soviel ich weiß kann man einen Destruktor (oder sollte es zumindest nicht) von Hand aufrufen, da das nicht funktioniert.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

10.07.2010, 08:43

Das ist ein Spezialfall. Wieso willst du sowas in einem Template haben?
@D13_Dreinig

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

10.07.2010, 09:01

was macht der destuktor denn dass er unbedingt aufgerufen werden soll?

hmm, vielleicht willst du das array auch kleiner machen, da musst du ein neues, kleineres array, reservieren, den kompletten inhalt(bis auf das gelöschte gelöschte element) kopieren, das alte array freigeben und den zeiger aufs array ändern.

denk aber daran, dass sich dabei deine indexvariablen(direkter zugriff) ändern. stell am besten iteratoren zur verfügung.
"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?

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

5

10.07.2010, 14:50

hey leute ... danke für eure antworten ...



@BurningWave: danke ... ich werde es versuchen

@David_pb: da ich in dieser speichersturktur den grßteil meiner daten verwalte (da die std das so ncih bringt wie ichs brauch) und ich das halt für unterschiedliche typen brauch ...

@NachoMan: der destruktor enthält n funktionscall der für den programmablauf wichtig ist ... und NEIN ich möchte das array nicht kleiner machen ;) wie das ginge wüste ich :P ... und ich hab das mit den index bereits gelöst :P ... ...
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

6

10.07.2010, 15:17

Zitat

Wenn du meinst, dass du den Speicher löschen und freigeben möchtest, um sicherzustellen, dass nichts mehr im Speicher verbleibt, benutze die Funktion ZeroMemory() und gebe den Speicher danach mittels delete frei. Soviel ich weiß kann man einen Destruktor (oder sollte es zumindest nicht) von Hand aufrufen, da das nicht funktioniert.

1: Einen Destruktor kann man von Hand aufrufen.
2: Einen Speicherbereich mit Nullen zu überschreiben um ihn anschließend zu löschen ist vollkommen sinnlos (dann kann man ihn ja auch direkt löschen)

Wenn auf jedem Fall nur Zeiger gespeichert werden, dann solltest du 1. statt dem template einfach void* als Datentyp verwenden und 2. delete verwenden

Wenn aber nicht nur Zeiger gespeichert werden sollen, dann solltest du das am besten garnicht beachten. Dass das es sich um Zeiger handelt ist dann ein Spezialfall, den du nicht beachten kannst/solltest (dass wollte David_pb wohl auch sagen).
Um das freigeben des Speichers muss sich dann der Anwender selbst kümmern, was auch gut so ist, denn es könnte ja mal notwendig sein, den Speicher auf den der Zeiger zeigt nicht direkt beim löschen freizugeben, weil er zum Beispiel noch woanders verwendet wird.

Wenn du dieses Löschen nur für einen bestimmten (Zeiger-)typ brauchst, dann könntest du auch eine Spezialisierung für diesen Typ erstellen.
Signaturen werden überbewertet

Zeus

Frischling

  • »Zeus« ist der Autor dieses Themas

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

7

11.07.2010, 00:32

@gr-pa: da hast du recht ... hab ich garnich bedacht ... :rolleyes: jetzt gehts ;)
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

Werbeanzeige