删除指针向量中的指针所指向的对象

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

本文关键字:指针 对象 删除 向量      更新时间:2023-10-16

我有一个指针向量,指向动态分配的火星结构。我的add函数似乎工作得很好,但我担心我的delete函数没有正确删除对象和指针。你们能看看删除功能,告诉我在哪里可以解决这个问题吗?

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

这将删除所有具有匹配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;
        }
    }
}

通过对指针调用delete,您将释放被指向对象使用的内存空间(事实上,内存不会被释放,但可以说它是可重用的)。

你在使用程序时会遇到的问题是,你删除了条目,然后缩小了向量的大小,但指针没有被删除,也没有设置为nullptr,这意味着你在尝试取消引用它时会遇到问题(你的代码只有在删除最后一个元素时才能工作)。

此外,您可以(应该?)使用c++11引入的新智能指针,在您的情况下,您可以用std::shared_ptr替换原始指针。

有关详细信息:http://en.cppreference.com/w/cpp/memory/shared_ptr