【发布时间】:2012-07-11 06:54:46
【问题描述】:
我有一个分配一些内存的类。例如:
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 函数来解决这个问题,那么任何人都可以指出我正确的方向吗?
【问题讨论】:
-
我猜你可以重新实现 QApplication::notify() 并在那里捕获异常......只是你理解的猜测......
-
这里的解决方法是弄清楚为什么你的程序试图分配过多的内存并阻止它开始。我不希望看到一个消息框告诉我程序内存不足而没有一个可行的解决方案。
-
是的,这是真的。现在正在发生错误,因为我正在加载一个“解压缩”它并将每个像素值存储在数组中的 jpg。我需要像素值来进行一些图像处理。截至目前,我预计不需要非常大的图像(如 10,000x10,000 像素),但如果有人决定加载这样的大图像,我想实施安全防护。将来我会考虑实现分解图像或将图像插入到更小的尺寸的功能。
标签: c++ qt memory-management new-operator