# Objekte löschen, deren zeiger in Vector gespeichert sind



## armin1893 (10. November 2008)

Hallo leute, ich hab folgendes Problem

Ich lege mehrere Objekte an, deren zeiger ich dann in einem Vector abspeichere.
Nun möchte ich einige oder alle Objekte wieder löschen und möchte nun den Speicher wieder frei haben, aber kreige das nicht hin.

hier mein Code


```
//vector, der zeiger auf Blob-Objekte enthält
//Blob ist eine Klasse, welche einige double Werte enthält
std::vector<Blob*> alle blobs;

//Anlegen eines Blobs
Blob * actual_Blob = new Blob()

//Einen Wert zuweisen
actual_Blob->area=6;

//Zeiger auf Blob in Vector schreiben
alle_blobs.push_back(actual_blob);

// Neus Blob Objekt anlegen
actual_Blob = new Blob();
```

usw..

so nun habe ich also einen vector mit Zeigern auf Blob. Ich kann wunderbar darauf zugreifen mit bspw.

```
alle_blobs[0]->area;
```

wie kann ich jetzt das Objekt löschen, dass alle Werte weg sind und vor allem der Speicher wieder frei wird. Ich habe nämlich ca 1 Mio Blobs, von denen ich dann ein paar rausfilter. die anderen brauch ich nicht und sollen deshalb gelöscht werden.

Ich habe scho versucht mit 

```
for( int i = 0; i < numBlobs; i++ ){
delete (Blob*) alle_blobs[i];
}
```
der Wert ist dann zwar anschließend weg bzw es steht 
-2.6569842580370804e+303   bei der Variablen, aber der Speicher wird nicht weniger.  Ich muss es also irgendwie hinbekommen, mittels des Zeigers auf den Blob, der ja in dem Vector enthalten ist, das Teil zu löschen. 

Könnt ihr mir helfen?

Grüße und danke schon mal


----------



## Ryu1991 (10. November 2008)

Hi, ich habe deinen Code nicht, gelesen, da mir das ohne die [code=cpp] Tags zu unübersichtlich ist, aber ein Objekt zu löschen ist kein Problem: 
	
	
	



```
std::vector testvector<*DeinObjekt>
for (int i = 0; i < 1000; i++){
  DeinObjekt *newobjekt = new DeinObjekt;
  testvector.push_back(newobjekt);
}
//soviel zum füllen

for(i = testvector.size() -1; i >=0;i--){
  delete testvector[i];
  testvector.erease(testvector.begin() + i)
}
//das zum löschen^^
```

so der Code ist natürlich ungetestet und mag fehler enthalten, aber eigentlich funktioniert es so

gruß Ryu


----------



## armin1893 (11. November 2008)

Ok das löschen geht soweit, aber ich weis jetzt wo das Speicherproblem liegt. Jedes Objekt Blob hat wiederum einen Vector mit mehreren sogenannten Run Objekten. und ich lösche dadurch eben nur den Vector mit den Blobs, aber nicht den Vector, der die Runs enthält. Wenn ich diesen mit der oben beschriebenen Methode lösche, kommt ein Fehler

Expression: _BLOB_TYPE_IS_VALID(pHeap->nBlockUse)

Komisch ist, dass ich ca 40 000 Blob Objekte in dem Vector habe, und erst nach ca 50 kommt der Fehler... Zum besseren Verständnis, die Klasse Run besitzt lediglich 3 integer.
ich lösche den Run Vector aber genauso wie den Blob Vector. Nur beim einen geht es, beim anderen nicht. Viell weist du was ich falsch mache. (muss ich da was am Destruktor machen?  hab da bissel gegoogelt. Oder versuche ich etwas zu löschen was nicht mehr da ist, anscheinend tritt dann dieser Fehler auf)


```
std::vector<Run*> runns

//über alle Blobs laufen
for( int i = alle_blobs.size()-1; i >=0; i-- )
		{

                //innerhalb eines Blobs über die Runs laufen
		for(int o=alle_blobs[i]->runns.size()-1; o>=0; o--){

               //Error!
		delete alle_blobs[i]->runns[o];
		alle_blobs[i]->runns.erase(blobs.alle_blobs[i]->runns.begin()+o);

			}

		//funktioniert
		  delete alle_blobs[i];
		   alle_blobs.erase(blobs.alle_blobs.begin()+i);

		}
```


----------



## devDevil (11. November 2008)

du solltest mal das sauberer trennen ... das löschen der runns gehört in den d-tor von deinem blob ...


----------

