[ad_1]
CEdit* の配列があります。この配列に NULL ではない要素がある場合は、これらを削除する必要があります。私は次のように書きました。
<pre>if (m_arEdit.GetSize() > 0) { for (int j = 0; j < m_arEdit.GetSize(); j++) if(m_arEdit[j] != NULL) delete m_arEdit[j]; //in this point software crashes because the element is NULL but it results not NULL }
ただし、デバッグ中の m_arEdit が NULL の場合、行は
if(m_arEdit[j] != NULL)
は true であり、ソフトウェアがクラッシュします。
私が試したこと:
言われたとおりにコードを書こうとしたのですが、正しくありません。理由がわかりません。
解決策 1
MFC を使用するのは久しぶりですが、問題は思っているよりも単純です。 delete
はメモリをヒープに戻すために使用されますが、CEdit コントロールからテキストは削除されません。
それがアプリがクラッシュする理由です。削除しようとしているメモリのチャンクは、別個に割り当てられていません。 new
そのためシステムが混乱し、すべてが故障します。
の代わりに delete
CEdit メソッドを使用してテキスト行を削除します。 CEdit クラス | Microsoft Learn[^]
余談ですが、アイテムを最初から削除しないでください。常に最後から削除して元に戻してください。
なぜ? 理由は 2 つあります。1 つ目は、大量の不必要なコピーを排除できること、そして 2 つ目は、すべてのアイテムを確認できることです。 最初から削除し、隣り合う 2 つの項目を削除する必要がある場合、最初の項目を削除してインデックスをインクリメントすると、2 番目の項目は参照されなくなります。
また、実際に何をしているのかについてもよく考えてみます。なぜ空ではない項目をすべて削除するのでしょうか。 どちらにしても最終的には「空」のコントロールが残るため、一度にすべてを削除する方が賢明ではないでしょうか?
解決策 2
このコードを複数回呼び出していると想定していますが、2 回目は delete
すでに削除されたエントリ。 コードを次のように変更する必要があります。
for (int j = 0; j < m_arEdit.GetSize(); j++) { if(m_arEdit[j] != NULL) { delete m_arEdit[j]; m_arEdit[j] = NULL; // ensure this entry is not tried again } }
[ad_2]
コメント