有没有办法安全删除指向 MyObject 的非唯一指针的 QList?
我知道这种问题已经被问到死了,但我想知道是否有办法做我在问题中所说的而不使用Boost库指针等。基本上我有以下一段删除二维 QList ( QList< QList > ) 中指针指向的对象的清理代码,
#include <QList>
QList< QList<MyObject*> > m_Data;
...
void CleanupMyObjectList
{
int numFrames = m_Data.size();
for(int i=0; i < numFrames; i++)
{
int numObjects = m_Data.at(i).size();
for(int j=0; j < numObjects; j++)
{
MyObject* removedObject = m_Data[i].at(j);
if(removedObject != NULL)
{
delete removedObject;//This assumes that the pointers are UNIQUE in this list!!! If not it will crash!!!
removedObject = NULL;
}
}
m_Data[i].clear();
}
m_Data.clear();
}
当我尝试清理由非唯一或共享填充的列表时,它确实崩溃了(这是正确的术语吗?)指针,例如当 m_Data[0][1] 等于 m_Data[1][1] 时。
我知道它为什么崩溃,所以请保存对此的解释,但我想知道是否有办法安全地删除这些对象,并尽可能少地修改代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最简单的方法是创建一个临时
std::set
。迭代 m_Data,而不是立即删除指针,而是将它们添加到集合中。接下来,删除集合中的所有指针。std::set
中没有重复项。您可以安全地删除
NULL
指针。无需检查The easiest way is to create a temporary
std::set<MyObject*>
. Iterate over m_Data, and instead of deleting the pointers straight away, add them to the set. Next, delete all pointers in the set. There are no duplicates in astd::set
.You can safely delete a
NULL
pointer. No need to check that因为你不想使用 boost 共享指针,
您可以使用 QList
QList< QList> > m_Data;
而不是QList< QList; > m_Data;
Because u don't want to use boost shared pointers ,
you can use
QList< QList<QSharedPointer<MyObject>> > m_Data;
instead ofQList< QList<MyObject*> > m_Data;