ノードを使用してリストコンテナを作成しています。次のノードポインタにアクセスするとC++がクラッシュする
これはノード構造の外観です。 mFirst
は、リストクラスのプライベートデータメンバーです。
struct Node{
Node(const EType & d, Node *n = nullptr) : mData(d), mNext(n) { }
EType mData;
Node *mNext;
};
Node *mFirst;
コンテナから要素を削除するための関数があります。
この問題は、オンラインで発生します。temp2->mNext = temp->mNext;
要素は削除されますが、プログラムがクラッシュします。
問題の原因は何もわかりません。
template <typename EType>
void Set<EType>::remove(const EType & x) {
if (isElement(x)) {
Node *temp = mFirst;
Node *temp2 = nullptr;
while(temp->mData != x) {
temp2 = temp;
temp = temp->mNext;
}
if (temp2 == nullptr) {
mFirst = temp->mNext;
} else {
temp2->mNext = temp->mNext;
}
}
}
私は行を変更した場合:
temp = temp->mNext;
temp2 = temp2->mNext;
temp2 = temp;
何も起こらない、と機能が動作しません。
両方の式が同じではありませんか?
'プログラムはクラッシュするでしょう。 'remove'メソッドは、' remove'の中で 'isElement'メソッドをマージして、それらの使用から離れたアサーションを避けることができたとしても正しいと思われます。 'mFirst'や' temp2-> mNext'は削除していないことに注意してください。 – Franck
デバッガを使って、問題の行で何が起きているか把握しようとすると、 'temp2'または' temp'が 'nullptr'であるか、' temp2'と 'temp'をコンソールに出力してそれらは 'nullptr'です。次に、それが起こる条件の下で理解しようとします。そして、あなたはあなたの問題をデバッグします。 – igagis