我有一个课,我分配了一些内存。例如:
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
函数来解决这个问题,那么任何人都可以指出我正确的方向吗?
答案 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
指针,请使用它。