2016-05-02 5 views
1

zeigt Ich habe einen Zeigervektor, der auf dynamisch zugewiesene Martian-Strukturen zeigt. Meine Add-Funktion scheint gut zu funktionieren, aber ich habe Angst, dass meine Löschfunktion kein ordnungsgemäßes Löschen von Objekt und Zeiger durchführt. Könnt ihr die Löschfunktion durchsehen und sagen, wo ich das Problem beheben könnte?Löschen des Objekts, das ein Zeiger in einem Zeigervektor auf

struct Martian 
{ 
    string fname, lname, ssid; 
    Martian(string fname, string lname, string ssid) : fname(fname), lname(lname), ssid(ssid){} 
}; 

class martianDatabase 
{ 
    public: 
     vector<Martian*> database; 
     martianDatabase(); 
     void deleteMartian(string deletedID); 
     void addMartian(int &i, string f, string l, string id); 
     int iterator = 0, size = 0; 
}; 

void martianDatabase::addMartian(int& i, string f, string l, string id) 
{ 
    this->database.push_back(new Martian(f, l, id)); 
    i++; 
} 

void martianDatabase::deleteMartian(string deleteID) 
{ 
    int i = 0; 
    while (i < size +1) 
    { 
     if (this->database[i]->ssid == deleteID){ 
     delete this->database[i]; 
     size--; 
     break; 
     } 
     else ++i; 
    } 
} 
+0

Woher haben Sie 'Größe'? und durch "size -" haben Sie das Element verloren, das sich am Ende des Vektors befindet und nicht das Element, das Sie löschen möchten. Und nicht wirklich verloren, aber ignoriert. –

+0

Sie entfernen das Element nicht aus dem Vektor, also versuchen Sie beim nächsten Versuch, das Element zu löschen, aus dem Speicher, der freigegeben wurde. –

+0

Dies ist eine offene Frage. Generische Codeüberprüfungen, die darauf hinweisen, was in Ihrem Code nicht stimmt, sind nicht Thema. –

Antwort

0

Dies löscht alle Martian Objekte mit ssid Werten entsprechen.

void martianDatabase::deleteMartian(string deleteID) 
{ 
    auto martianIterator = database.begin(); 

    while(martianIterator != database.end()) 
    { 
     if((*martianIterator)->ssid == deleteID) 
     { 
      delete *martianIterator; 
      martianIterator = database.erase(martianIterator); 
     } 
     else 
     { 
      ++martianIterator; 
     } 
    } 
} 
+0

wenn ich das direkt p-lug, bekomme ich den Fehler Member Reference Basistyp 'Marsian *' ist keine Struktur oder Union auf der if (* (martianIterator) -> ssid == deleteID) Linie – Ammar

+0

Hoppla, ich werde repariere das. – DaveyLaser

0

von auf einem Zeiger löschen ruft Sie den Speicherplatz durch die spitzen Gegenstand verwendet befreien (in der Tat nicht der Speicher freigegeben werden, aber wir sagen es wieder verwendbar sein wird).

Das Problem, das Sie mit Ihrem Programm auftreten, ist, dass Sie Ihren Eintrag löschen, dann die Größe des Vektors reduzieren, aber der Zeiger wird nicht entfernt und nicht auf nullptr gesetzt, was bedeutet, dass Sie Probleme haben, es zu dereferenzieren Code funktioniert nur, wenn Sie das letzte Element löschen.

Sie könnten (sollten?) Auch die neuen Smartpointer von C++ 11 verwenden, in Ihrem Fall könnten Sie Ihre rohen Zeiger durch std :: shared_ptr ersetzen.

Für weitere Informationen: http://en.cppreference.com/w/cpp/memory/shared_ptr

Verwandte Themen