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

标签 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.

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

最佳答案

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

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

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

警告一下,错误的分配通常是不可恢复的。异常(exception)情况是,当您知道要分配大量内存(可能基于用户输入)时,您通常不会使用非常耗内存的应用程序。

编辑:

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

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

关于c++ - 在类中分配过多动态内存时,Qt 会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422484/

相关文章:

c++ - 由于堆分配/解除分配导致堆栈溢出

c++ - 函数指针和类模板

python - PySide 是否支持 Python 3?

java - 减少内存流失的方法

c# - 在内存中存储数组的最佳实践

C++11:非平凡的线程局部静态变量?

c++ - 是否有任何非GPL开源C\C++ H264编码库?

mysql - QT5 找到 MySQL 但在 Debian 上无法加载它

xml - 如何在 Qt 中读取 XML 节点的属性?

Delphi对象引用模型