【解決方法】編集内容の削除に関する問題

[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 すでに削除されたエントリ。 コードを次のように変更する必要があります。

C++
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]

コメント

タイトルとURLをコピーしました