在类中分配过多的动态内存时,Qt会抛出错误

时间:2012-07-10 21:43:21

标签: c++ qt memory-management new-operator

我有一个课,我分配了一些内存。例如:

class image {

public:
    image(){
        pixelvalue = 0;
    }

    void formatandcopy() {
        pixelvalue = new int [10000*50000];
        if(pixelvalue)
            qDebug()<<"allocation successful"; 
        else 
            qDebug()<<"allocation failed";
    }
private:
    int *pixelvalue;
};

当我致电formatandcopy()时,程序会抛出这个:

Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.

任何人都知道如何防止这种情况并让用户知道它只是内存不足?当我运行它时,它甚至没有显示allocation failed。在调用qDebug()之前抛出上述错误。如果分配的内存量减少,程序运行正常。我认为这很奇怪,因为在使用new运算符而不是qt函数时会抛出此错误。此外,我的机器有足够的内存。我假设这是qt将程序限制到某个堆空间的结果。最后,如果我能通过重新实现notify函数来解决这个问题,那么任何人都可以指出我正确的方向吗?

3 个答案:

答案 0 :(得分:3)

您应该能够捕获 std::bad_alloc 来处理该函数中的异常。例外是标准C ++的一部分。

try {
  // ...
} catch (std::bad_alloc &a) {
  // ...
}

如果超出该范围(进入Qt事件处理),则必须按照指定实施QApplication::notify

作为警告,不良分配通常无法恢复。例外情况是,当您通常不使用内存非常耗尽的应用程序时,您知道要分配的数量非常大(可能基于用户输入)。

编辑:

澄清一下,如果你的应用程序的设计允许你的内存不足,那么如果你捕获bad_alloc并忽略它们,那么任何事情都不会发生变化。该程序已经死了,您只能显示有关所发生事件的错误消息。这也很棘手,因为你无法分配任何内存来创建消息框!

计数器示例是向用户询问文件并将其全部读入内存的场景。最终他们会尝试给你一个他们没有内存的文件,你可以安全地告诉他们尝试另一个文件。这些问题通常在应用程序中被隔离,值得防范。

答案 1 :(得分:1)

错误消息告诉您到底发生了什么以及该怎么做:异常无法传播出事件处理程序(或信号/插槽机制内的任何内容),以便正确处理异常,必须捕获它们在QApplication::notify()内,像这样:

bool MyApplication::notify( QObject* receiver, QEvent* event )
{
    try {
        return QApplication::notify( receiver, event );
    } catch ( std::exception& e ) {
        cout << "Arrrgggghhhh" << endl;
        return false;
    }
}

此外,您的操作系统决定了您可以拥有多少堆空间,而不是Qt。

答案 2 :(得分:0)

您不需要通过执行pixelvalue检查if(pixelvalue)完整性,如果new失败则抛出异常并且指针未分配到任何地方,pixelvalue不会存在,因此检查不存在的指针的完整性是没用的。如果要检查它是否不是NULL指针,请使用它。