Qt/C++运行报错:exited with code -1073741819
这是 Windows 系统下常见的 运行时崩溃 错误码,具体含义是:
0xC0000005:Access Violation(访问冲突),也就是程序试图访问它没有权限访问的内存地址。
该错误出现的原因可能有:
1. 空指针调用
常见的情况为:定义了一个指针变量,但是没有对指针变量初始化。
解决方法:给指针变量初始化为NULL,或者新建一个指针对象
int *x2GBox = nullptr;
或者
QGroupBox *x2GBox = new QGroupBox("My Group Box");
2. 内存越界访问
比如数组访问越界、使用了野指针等。
前者比较简单,不作解释。第二种情况稍微复杂一点,常见的情形为:指针还没调用但是先运行了delete语句把指针删除了,此时指针就是野指针。
野指针的定义:
野指针(Dangling Pointer)是指向已经被释放或未分配内存的指针。与空指针不同,野指针指向的内存可能曾经有效但现在已不再安全使用。这类指针可能会导致不可预测的行为,包括程序崩溃、数据损坏或安全漏洞,因为它们引用的内存可能已被重新分配给其他用途。
野指针的主要产生原因:
- 内存释放后未置空:当你通过 delete 或 free() 释放了指针所指向的内存后,若没有将该指针设置为 nullptr,它就成了野指针。为了避免这个问题,可以使用智能指针来定义和创建指针变量,笔者暂时还没用到,如果用到会持续更新。
- 局部变量生命周期结束:如果函数内的局部变量地址被返回,并在外部使用,那么当这个局部变量的作用域结束后,指针就变成了野指针。例如:
int* badFunction() {int localVar = 10;return &localVar; // 返回局部变量的地址,危险!
}
- 对象成员指针问题:在C++中,如果一个类的成员是指针类型,在复制对象时如果没有正确处理深拷贝和浅拷贝的问题,也可能导致野指针。
浅拷贝:在复制对象时,只是简单地复制了指针的值,即两个对象中的指针将指向同一块内存地址。这意味着如果其中一个对象删除了这块内存,另一个对象中的指针就变成了野指针,因为它现在指向了一块已经被释放的内存。
深拷贝:在复制对象时,不仅复制了指针本身,还为新对象分配了新的内存,并把原对象所指向的数据内容也复制了一份到新分配的内存中。这样,两个对象就各自拥有自己的数据副本,互不影响。
使用浅拷贝的例子:
class String {
public:char* data;String(const char* p) {int length = strlen(p);data = new char[length + 1];strcpy(data, p);}// 默认的拷贝构造函数实现的是浅拷贝String(const String& other) {data = other.data; // 这里是浅拷贝}~String() {delete[] data;}
};
在这个例子中,如果我们创建了一个 String 对象并使用它来初始化另一个对象,那么这两个对象将共享同一个 data 数组。如果其中一个对象被销毁(调用析构函数),它会释放 data 指向的内存,这会导致另一个对象中的 data 成为野指针,因为这块内存已经不再有效。
使用深拷贝的例子:
class String {
public:char* data;String(const char* p) {int length = strlen(p);data = new char[length + 1];strcpy(data, p);}// 修改后的拷贝构造函数实现深拷贝String(const String& other) {int length = strlen(other.data);data = new char[length + 1]; // 分配新内存strcpy(data, other.data); // 复制数据}~String() {delete[] data;}
};
在修改后的版本中,拷贝构造函数为新对象分配了自己的内存,并从原始对象复制了数据。这就确保了每个 String 对象都拥有自己独立的数据副本,避免了由于共享数据而导致的野指针问题。
3. 库版本不匹配 / 缺失 Qt DLL 文件
4. 插件缺失或路径错误
后面两个原因是AI给出的,笔者暂时还没遇到这种情况,如果有其他原因会持续更新......敬请期待