清理一堆指针
Posted
技术标签:
【中文标题】清理一堆指针【英文标题】:Cleaning up a stack of pointers 【发布时间】:2013-08-08 08:38:07 【问题描述】:我在时遇到了一些问题。在下面删除崩溃的行中:“内存错误/分段错误”。
std::stack<reports*> stack;
while(db.fetch())
reports* report = new report(db);
QThreadPool::globalInstance()->start(report);
stack.push(report);
while( QThreadPool::globalInstance()->activateThreadCount() != 0 );
while( !stack.empty() )
delete stack.top();
stack.pop();
我认为这段代码的上下文不相关。除了: db 通过引用传递给报告构造函数,该构造函数立即将必要的当前行数据复制为非指针成员。 有人可以给我一个提示吗?
编辑:
自我回答:
好吧,我刚写完问题就被上帝之光感动了。
默认情况下
QThreadPool::globalInstance()->start(report);
将取得该对象的所有权。在循环中添加以下行即可解决问题:
report->setAutoDelete(false);
或者只是不清理......我自己让 Qt 去做。
【问题讨论】:
使用smart pointer? 我可能错了,但你为什么要删除stack.top()
,然后删除pop()
?我想这将是一个 instacrash。
线程并发问题?在对它们执行操作之前,使用互斥锁锁定每个有争议的对象。
report
析构函数是什么样的? reports
基类有虚析构函数吗?
@Levente Kurusa delete stack top 将删除栈顶地址指向的内容。弹出将采用堆栈顶部的地址。
【参考方案1】:
好吧,我刚写完问题就被上帝之光感动了。
默认情况下
QThreadPool::globalInstance()->start(report);
将取得该对象的所有权。在循环中添加以下行即可解决问题:
report->setAutoDelete(false);
或者只是不清理......我自己让 Qt 去做。
【讨论】:
您应该将此添加到您的原始帖子中。【参考方案2】:您可以做两件事来避免显式内存消耗,并解决您的问题:
使用smart pointers。 使用参考。在堆栈的情况下,STL 容器的要求之一是元素必须是可复制的。您可以使用 std::ref 包装参考来解决此问题。在这种情况下,我认为使用std::shared_ptr 是最好的方法。
【讨论】:
嗯,我相信指针总是可以被复制的?它只是一个内存地址? @user2346536 是的,可以复制原始指针。但是你必须明确地管理它的生命周期。阅读答案的智能指针链接。【参考方案3】:我认为我们需要查看报告类,显然您处理得很好,因此当您尝试删除它们时,问题一定出在报告(堆栈顶部)。
检查/创建报告析构函数,你必须在那里处理一些事情
【讨论】:
我在上面的评论中回答了这个问题:@claptrap 很好。尽管报告类中没有指针的静态成员。所以这不是问题。我在下面回答了我自己的问题。不管怎么说,还是要谢谢你。谁给你投了-1?这个答案一点也不傻……以上是关于清理一堆指针的主要内容,如果未能解决你的问题,请参考以下文章