Masalah dengan menghapus hasil edit

pemrograman


Saya memiliki array CEdit*, jika array ini memiliki elemen yang bukan NULL saya harus menghapus ini..Saya menulis:

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

	}

tetapi ketika di debug m_arEdit adalah NULL barisnya if(m_arEdit[j] != NULL)

benar dan perangkat lunak mogok..

Apa yang saya coba:

Saya mencoba menulis kode seperti yang saya katakan tetapi itu tidak benar dan saya tidak tahu mengapa

Solusi 2

Saya berasumsi bahwa Anda memanggil kode ini lebih dari sekali, dan untuk kedua kalinya Anda mencobanya delete entri yang telah dihapus. Anda harus mengubah kode menjadi:

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
    }
}

Solusi 1

Sudah lama sekali saya tidak menggunakan MFC… tetapi masalah Anda lebih sederhana dari yang Anda kira: delete digunakan untuk mengembalikan memori ke heap, itu tidak akan menghapus teks dari kontrol CEdit.

Dan itulah sebabnya aplikasi Anda mogok: potongan memori yang Anda coba hapus tidak dialokasikan secara terpisah new sehingga sistem menjadi bingung dan semuanya rusak.

Alih-alih delete gunakan metode CEdit untuk menghapus baris teks: Kelas CEdit | Microsoft Belajar[^]

Dan sebagai tambahan, jangan pernah menghapus item dari awal – selalu hapus dari akhir dan kerjakan kembali.
Mengapa? Ada dua alasan: pertama, ini menghilangkan banyak penyalinan yang tidak perlu, dan kedua, ini berarti Anda melihat setiap item. Jika Anda menghapus dari awal dan dua item yang bersebelahan perlu dihapus, menghapus item pertama dan menambah indeks berarti Anda tidak melihat item kedua.

Saya juga berpikir keras tentang apa yang sebenarnya Anda lakukan: mengapa Anda menghapus semua item yang tidak kosong? Bukankah lebih masuk akal untuk menghapus semuanya sekaligus karena Anda akan mendapatkan kontrol yang “kosong”?

Solusi 3

Berdasarkan jawaban Richard, saya akan membuat sedikit perubahan.

C++
int size = m_arEdit.GetSize();
for (int j = size - 1; j >= 0; j--)
{
    if(NULL != m_arEdit[j])
    {
        delete m_arEdit[j];
        m_arEdit[j] = NULL;
    }
}

コメント

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