Vấn đề với việc xóa bản chỉnh sửa

lập trình

[ad_1]

Tôi có một mảng CEdit*, nếu mảng này có các phần tử không phải là NULL thì tôi phải xóa chúng..Tôi đã viết:

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

	}

nhưng khi gỡ lỗi m_arEdit là NULL hàng if(m_arEdit[j] != NULL)

là đúng và phần mềm bị lỗi..

Những gì tôi đã thử:

Tôi đã thử viết mã như tôi đã nói nhưng nó không đúng và tôi không biết tại sao

Giải pháp 2

Tôi giả sử rằng bạn đang gọi mã này nhiều lần và lần thứ hai bạn đang cố gắng delete một mục đã bị xóa. Bạn nên thay đổi mã thành:

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

Giải pháp 1

Lâu lắm rồi tôi mới sử dụng MFC… nhưng vấn đề của bạn đơn giản hơn bạn nghĩ: delete được sử dụng để trả bộ nhớ về vùng heap, nó sẽ không xóa văn bản khỏi điều khiển CEdit.

Và đó là lý do tại sao ứng dụng của bạn gặp sự cố: phần bộ nhớ bạn đang cố xóa không được phân bổ riêng với new nên hệ thống bị rối loạn và mọi thứ đều hỏng.

Thay vì delete sử dụng các phương pháp CEdit để xóa dòng văn bản: Lớp CEdit | Microsoft Tìm hiểu[^]

Và cũng như một điều khác, không bao giờ xóa các mục từ đầu – luôn xóa từ cuối và làm lại.
Tại sao? Hai lý do: thứ nhất là nó loại bỏ rất nhiều sự sao chép không cần thiết, và thứ hai, nó có nghĩa là bạn phải xem xét mọi mục. Nếu bạn xóa từ đầu và hai mục cạnh nhau cần phải xóa, thì việc xóa mục đầu tiên và tăng chỉ số có nghĩa là bạn không nhìn vào mục thứ hai.

Tôi cũng đã suy nghĩ khá kỹ về chính xác những gì bạn đang làm: tại sao bạn lại xóa tất cả các mục không trống? Sẽ hợp lý hơn nếu loại bỏ mọi thứ trong một lần vì cuối cùng bạn sẽ có một điều khiển “trống”?

Giải pháp 3

Dựa trên câu trả lời của Richard, tôi sẽ thực hiện một thay đổi nhỏ.

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

[ad_2]

コメント

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