2016-05-02 246 views
1

我有一個指向動態分配的火星結構的指針向量。我的添加功能似乎工作正常,但我害怕我的刪除功能沒有做適當的刪除對象和指針。你們可以通過刪除功能看看,並告訴我該如何解決問題?刪除指針向量中的指針指向的對象

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

你從哪裏得到'size'?並按'大小 - '丟失了位於矢量末尾的元素,而不是你想要刪除的元素。而不是實際失去,但忽略。 –

+0

您不會從任何地方將該項目從矢量中移除,因此下次嘗試刪除時,您可能會嘗試從已釋放的內存中讀取數據。 –

+0

這是一個開放式問題。通用代碼評論指出你的代碼有什麼問題是脫離主題。 –

回答

0

這將刪除所有Martian對象匹配ssid值。

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

當我直接p-lug那,我得到錯誤成員參考基類型'火星*'不是一個結構或聯合的if(*(martianIterator) - > ssid == deleteID)行 – Ammar

+0

哎呀,我會解決該問題。 – DaveyLaser

0

通過調用刪除您將釋放被尖銳物體使用的內存空間(其實內存不會被釋放,但讓說,這將是可重複使用)的指針。

你的程序遇到的問題是你刪除了你的條目,然後減少你的矢量的大小,但是指針不會被刪除,也不會設置爲nullptr,這意味着當你嘗試解除引用時你會遇到問題代碼將只在刪除最後一個元素時才起作用)。另外,你可以(應該?)使用由C++ 11引入的新智能指針,在你的情況下,你可以用std :: shared_ptr替換原始指針。

欲瞭解更多信息: http://en.cppreference.com/w/cpp/memory/shared_ptr