簡體   English   中英

刪除指針向量中指針指向的對象

[英]Deleting the object that a pointer in a vector of pointers points to

我有一個指針向量,指向動態分配的火星結構。 我的添加功能似乎工作正常,但我害怕我的刪除功能沒有正確刪除對象和指針。 你們可以看看刪除功能,並告訴我在哪里解決問題?

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;
   }
}

通過在指針上調用delete,您將釋放指向對象使用的內存空間(事實上,內存不會被釋放,但可以說它將是可重用的)。

您將遇到的程序問題是您刪除了您的條目,然后減少了向量的大小,但指針未被刪除而且未設置為nullptr,這意味着在嘗試取消引用它時會遇到問題(您的代碼只能工作)如果刪除最后一個元素)。

此外,您可以(應該?)使用c ++ 11引入的新智能指針,在您的情況下,您可以用std :: shared_ptr替換原始指針。

有關更多信息,請訪問: http//en.cppreference.com/w/cpp/memory/shared_ptr

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

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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM