[ad_1]
我有一个 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; } }
[ad_2]
コメント