在使用QT写GraphicsView时,运行程序添加Item时,无缘无故报错了,debug调试也是跳到QT源码上面去,还都不是报同一个位置的错误,有些还是new的位置报错。而报错信息是“Critical error detected c0000374”,搜出来的文章也都是内存不足、越界之类,还有说用智能指针的问题,但以上问题我都没有。
当内存充足时,new还能报错,那应该是跟内存没多大关系了。加上在代码不改或者一些毫无影响的改动的情况下,报错还不是在同一个地方,我觉得可以排除内存不足、越界之类。
- 但程序蹦绝大部分又是跟指针有关,所以我把我类里面的指针变量注释了,结果运行一点问题都没有,而且我这指针的还是只定义了还没用,连赋值nullptr的操作都没有,真的奇了怪了。如下例1代码
//例1
//.h文件
class A{
int a;
int b;
int *p;//注释了,运行就没问题,不注释运行就蹦,打印的错误信息“Critical error detected c0000374”
int c;
...
int z;
}
//.cpp文件
A::A:a(0),b(1),c(2){}
- 我只把指针变量写在所有变量的后面,这么顺序一换,运行又没问题,我以为这就把问题解决了,结果只给这变量赋值nullptr就又蹦了。如下例2代码
//例2
//.h文件
class A{
int a;
int b;
int c;
...
int z;
int *p;
}
//.cpp文件
A::A:a(0),b(1),c(2),
p(nullptr)//注释就能运行,不注释运行就蹦,打印的错误信息“Critical error detected c0000374”
{}
- 一开始怀疑是不是变量类型的问题,但后面换了其他类型一样不行。怀疑会不会是因为.cpp文件数据有问题,于是新建了一个.h和.cpp文件,打算重新写原本那文件的代码,结果就只写成类似如下的代码,就是只写了原本.h文件变量定义和构建函数,其他的都没写,运行没问题,然后我就重新试了之前有问题的.h.cpp文件,发现也可以运行,一点问题都没有,代码一点都没改过,后面也试了改成之前出问题的样子,结果也是没问题。这个过程只是将源代码重新构建生成了,将以前的编译生成的任何文件都重新生成了一遍。因为Qt添加新文件之后,要重新 执行qmake->构建/运行/重新构建(或者 清除->构建/运行/重新构建),这个过程就将以前编译生成的.obj、ui_xxx等文件都重新按照现在的代码去生成了。所以我怀疑是之前编译生成的相关文件有问题,导致出现了“Critical error detected c0000374”的问题
//
//.h文件
class A{
int a;
int b;
int c;
...
int z;
int *p;
}
//.cpp文件
A::A:a(0),b(1),c(2),
p(nullptr)
{}
根据上面的猜测,排除内存、越界之类和智能指针的问题,可以尝试的解决方案:1、将之前编译生成的文件全部清除,并将所有内容再重新编译生成一遍。
2、将有问题的.h.cpp重新打一遍,最好别复制,避免文件数据有问题。复制有可能会把之前有问题的数据一起复制了。
3、先做2,再做1