删除编辑的问题


我有一个 CEdit* 数组,如果该数组包含不为 NULL 的元素,我必须删除这些元素..我写道:

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

	}

但在调试时 m_arEdit 为 NULL 该行 if(m_arEdit[j] != NULL)

是真的,软件崩溃了..

我尝试过的:

我尝试按照我所说的方式编写代码,但它不正确,我不知道为什么

解决方案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
    }
}

解决方案1

我已经很久没有使用MFC了……但是你的问题比你想象的要简单: delete 用于将内存返回到堆,它不会从 CEdit 控件中删除文本。

这就是您的应用程序崩溃的原因:您尝试删除的内存块没有单独分配 new 所以系统会变得混乱,一切都会崩溃。

代替 delete 使用 CEdit 方法删除文本行: CEdit 类 | 微软学习[^]

顺便说一句,永远不要从头开始删除项目 – 始终从末尾删除并返回。
为什么? 有两个原因:首先,它消除了很多不必要的复制,其次,这意味着您可以查看每一项。 如果您从头开始删除并且需要删除彼此相邻的两个项目,那么删除第一个项目并增加索引意味着您不会查看第二个项目。

我还会认真思考你到底在做什么:为什么要删除所有非空项目? 一次性删除所有内容不是更明智吗,因为无论哪种方式最终都会得到一个“空”控件?

解决方案3

在理查德的回答的基础上,我会做一个小小的改变。

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をコピーしました