如何解决为什么我不能捕获OOM异常?
我有一个读取大文件以填充QStringList的函数。该程序崩溃可能是因为没有足够的内存,因为如果我使用一个小的文件,该程序将运行良好。我尝试通过捕获异常来调试问题。
QStringList readlargefile(QString filename)
{
QStringList result;
QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
{
qDebug()<<"cannot open file: "<<filename;
return result;
}
QTextStream in(&file);
in.setCodec("UTF-8");
QString line;
while(in.readLineInto(&line))
{
if(!line.isEmpty())
result<<line;
}
file.close();
return result;
}
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
QStringList result;
try
{
qDebug()<<"reading file";
result=readlargefile("largefile.txt");
}
catch(...) {
qFatal("got exception");
}
}
输出为:
reading file
Killed
我无法捕捉到异常,为什么?
解决方法
如果您的程序被OS中止,则不会产生任何异常。但是您可以设置信号处理程序:
void signalHandler(int)
{
//...
}
int main(int argc,char* argv[])
{
signal(SIGINT,signalHandler);
signal(SIGTERM,signalHandler);
#ifdef Q_OS_WIN
signal(SIGBREAK,signalHandler);
#endif
无法捕获std::bad_alloc
的原因是Qt可能使用的是::new
的无掷版本。或者new
还可以,但公主在另一座城堡里。
您可能会因原始问题(崩溃)而遇到两个陷阱。
1。可能是重新分配问题。
当阵列已经装满,并且您尝试插入更多阵列时,它将分配一个新阵列并从前一个阵列中复制(移动)数据。因此,最终要有两个大数组,直到复制(移动)完成。如果您知道前面的确切字符串数,则可以尝试预分配数组以确保没有重新分配。为此使用QList::reserve()
。
2。像QList和QVector这样的Qt容器最多只能容纳2GB的数据。
如果sizeof(QString)
为8字节,则最多允许2 ^ 28个项目。
如果您尝试存储更多内容,它将最终崩溃。尝试std::vector
(与reserve
一起使用),检查其是否有效。
毕竟,如果您的系统没有足够的内存来完成任务-它没有足够的内存,那么除了更改算法之外,您无能为力。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。