2016-05-09 7 views
0

Löscht ein kopierter Zeiger genauso wie der ursprüngliche Zeiger?einen kopierten Zeiger löschen

int * a = new int; 
*a = 8; 
int *b = a; 
delete b; 

In dem obigen Code, nach b löschen, sollte ich a löschen noch?

In dem realen Code, den ich habe ein Problem mit, ich

tat
std::vector<ifstream * >Infiles(5); 
for (int i = 0; i < 5; ++i){ 
    ifstream * ptr = new ifstream; 
    (*ptr).open(file_names[i].c_str()); 
    Infiles[i] = ptr; 
} 

/* doing a bunch of reading with Infiles */ 

for (int i = 0; i < Infiles.size(); ++i){ 
      delete Infiles[i]; // this part crashes 
      Infiles[i] = NULL; 
} 

Aber die Linie delete Infiles[i]; Abstürze verursacht, was mit meinem Code falsch?

+0

Kommentieren Sie das '/ *, indem Sie mit dem Infiles * /' Code eine Menge lesen. Stürzt der Code noch ab? – PaulMcKenzie

Antwort

1

Ja, Sie sind absolut richtig. Das Löschen über einen Zeiger bewirkt, dass alle Zeiger, die auf das gelöschte Objekt verweisen, ungültig sind. Und die beste Möglichkeit, Probleme wie diese zu vermeiden, ist die Verwendung von besitzenden Zeigern in C++ - Code.

By the way, diese Tatsache ist der beste Grund, nicht Satz Zeiger auf nullptr nachdem sie zu löschen - da es nichts zu anderen Kopien des gleichen Zeigers des Fall ist, ist es nicht der Code macht nicht sicherer.