[英]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.