2

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

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 failedqDebug()在调用之前会抛出上述错误。如果分配的内存量减少,程序运行良好。new我认为这很奇怪,因为在使用运算符而不是 qt 函数时会引发此错误。此外,我的机器还有足够的内存。我认为这是 qt 将其程序限制在某个堆空间的结果。最后,如果我可以通过确实重新实现该notify功能来解决这个问题,那么任何人都可以指出我正确的方向来做到这一点吗?

4

3 回答 3

3

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

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

如果它超出了该范围(进入 Qt 事件处理),那么您将不得不QApplication::notify按照他们指定的方式实现。

作为警告,错误的分配通常是不可恢复的。例外情况是,当您知道自己分配了非常大的内存量(可能基于用户输入)时,您通常不会使用非常消耗内存的应用程序。

编辑:

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

反例是向用户询问文件并将其全部读入内存的场景。最终他们会尝试给你一个他们没有内存的文件,你可以安全地告诉他们尝试另一个文件。这类问题通常在应用程序中是孤立的,非常值得警惕。

于 2012-07-10T21:48:51.280 回答
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。

于 2012-07-10T21:53:12.033 回答
0

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

于 2012-07-10T21:57:19.753 回答