2016-05-02 205 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