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

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するとエラーが出るメンバー参照の基本型 'Martian *'はif(*(martianIterator) - > ssid == deleteID)の行で構造体または共用体ではない – Ammar

+0

それを修正してください。 – DaveyLaser

0

あなたのプログラムで遭遇する問題は、あなたのエントリを削除してからベクトルのサイズを小さくすることですが、ポインタは削除されず、nullptrに設定されません。つまり、逆参照しようとすると問題が発生します。コードは、最後の要素を削除した場合にのみ機能します)。

また、C++ 11で導入された新しいスマートポインタを使用することもできます(あなたの場合は、生ポインタをstd :: shared_ptrに置き換えることができます)。詳細について

:これはssid値が一致するすべてのMartianオブジェクトを削除

http://en.cppreference.com/w/cpp/memory/shared_ptr
関連する問題