清理一堆指针

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?这个答案一点也不傻……

以上是关于清理一堆指针的主要内容,如果未能解决你的问题,请参考以下文章

解析PFQuery谓词指针对象

智能指针的原理及其应用

Rust编程语言入门之智能指针

C++智能指针简述:智能指针总结及补充

面试———智能指针

智能指针和异常