2017-02-24 10 views
0
bool StudentList::remove(const char * studentName) 
{ 
    for (int i = 0; i < MAX_SIZE; i++) 
    { 
     if (this->students[i]->isEqualTo(studentName)) // Finds a name to remove 
     { 
      cout << "Remove: "; // Displays name wished to be removed 
      students[i]->print(); 
      // delete[] students[i]; - Crashes 
      // students[i] = NULL; - Replaces removed name with null, stops working. 
      // students[i]->~Student(); - Call deconstructor, Crashes. 
      return true; 
     } 
    } 
    return false; 
} 

1つの要素を配列から削除したいだけですが、その要素を削除するとクラッシュすることがあります。 [i]は動的に割り当てられた配列を削除するC++

学生はポインタ配列である、と私はあなたがstudentnameを見つけることができれば、学生の各インスタンスを削除したいと思われ、選択した要素

+4

[配列要素を削除して残りの要素を移動する]の可能な複製(http://stackoverflow.com/questions/879603/remove-an-array-element-and-shift-the-remaining-ones) – MSD

+0

参照ソリューションは、[この(http://stackoverflow.com/questions/9246165/how-to-remove-elements-from-dynamically-allocated-array)古いSOの質問で提供されます。 –

+0

'StudentList :: students'の定義を参照する必要があります(配列、ポインタ、unique_ptrsのベクトル、または何ですか?)、および基本型の参照)。また、「動作停止」とは何かを知る必要があります。コードがクラッシュすると、私たちが[mcve]を持っていなければ、これはおそらく閉じられるでしょう。 –

答えて

0

を削除する必要があります。

studentsポインタの2次元構造のようです。すなわち、 **students。しかし、間違った方法で削除しています。まず、students[i]のインスタンスを削除してから、学生のインスタンスを削除してください。

また、インスタンスを削除した後にデストラクタstudents[i]->~Student();を呼び出すので、student[i] = NULLを割り当てたので、再びクラッシュする可能性があります。それは、NULL->~Student() - それはまた、クラッシュをリードします。

は、次の方法でそれを削除する必要があります。

for (int i = 0; i < MAX_SIZE; i++) 
{ 
    if (this->students[i]->isEqualTo(studentName)) // Finds a name to remove 
    { 
     students[i]->~Student(); 

     delete students[i]; 

     students[i] = NULL; 
    } 
} 
delete[] students; 

students = NULL; 
+0

デストラクタを呼び出すことはできません。 –

+0

あなたは1人の生徒しか削除できません。 –

+0

@GoverNator:なぜあなたは1人の学生しか削除できませんか? 'this-> student'はポインタの配列であるようです。私は各要素を削除しなければならないと思っています(ただし、スマートポインタのベクターにすることを除いて、図書館は私のために重労働をさせます)。 –

0

まずquetionを、あなたは本当に「学生」オブジェクトを削除する必要がある場合。そうならば、あなたのようないくつかの悪いコードを追加することができます:あなたの生徒がいないだけで、この配列に格納されている場合

students[i] = nullptr; 

、あなたはそれらの削除のためにそのストレージが責任を作ることができます。しかし、後でヌルポインタを使用するため、両方の方法があまり良くありません。コレクションの使用方法については、vectorなどをご覧ください。配列からポインタを削除するだけで済みます。

関連する問題