gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:14:22 25 4
gpt4 key购买 nike

我有一个类,我在其中分配了一些内存。例如:

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 函数来解决这个问题,那么有人能指出正确的方向吗?

最佳答案

你应该能够 catch 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com