清理一堆指针

时间:2013-08-08 08:38:07

标签: c++ multithreading qt stl

我在清理一堆指针时遇到了一些问题。在下面删除崩溃的行:“内存故障/分段故障”。

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去做。

3 个答案:

答案 0 :(得分:1)

在写完我的问题之后,我被神灯触摸了。

默认

QThreadPool::globalInstance()->start(report);

将取得对象的所有权。在循环中添加以下行可以解决问题:

report->setAutoDelete(false);

或者只是不清理......我自己让Qt去做。

答案 1 :(得分:0)

你可以做两件事来避免明确的记忆魔法,并解决你的问题:

  • 使用smart pointers
  • 使用参考。在堆栈的情况下,STL容器的一个要求是元素必须是可复制的。您可以使用std::ref解决此问题。

在这种情况下,我认为使用std::shared_ptr是最好的方式。

答案 2 :(得分:-1)

我认为我们需要查看报告类,显然您正在处理堆栈,因此当您尝试删除它时问题必须在报告(堆栈顶部)。

检查/创建报告析构函数,必须有一些你可能在那里处理的东西