qt 调试时出现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt 调试时出现相关的知识,希望对你有一定的参考价值。

启动调试器...
调试开始
limiting remote suggested packet size (131072 bytes) to 16384
Could not load shared library symbols for 4 libraries, e.g. C:\sys\bin\QtCore.dll.
Do you need "set solib-search-path" or "set solib-absolute-prefix"?

段错误:一般由于访问了已被释放的空间或者访问了求定义的空间引起。

1、查一下,是不是定义了指针,没有为指针赋初值,或者数组下标越界。

2、Debug一下,设置断点,找出是哪里出现段错误了,再找原因。追问

点调试开始就出这个错,在哪设置断点都没用。
指针用的非常多,数组也无数。
Could not load shared library symbols for 4 libraries, e.g. C:\sys\bin\QtCore.dll.
可能是找不到我用的库吧?

追答

重新装一下试试吧

参考技术A 指针错误或者数组越界

qt调试时出现的错误:The inferior stopped because it received a signal from the Operating System.

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include<cstring>
#include<vector>
using namespace std;
class stu

private:
string id;
string name;
string tel;
public:
void display();
void get();
;
void stu::display()

cout<<id<<name<<tel<<endl;

void stu::get()

string name4;
cin>>name4;
fstream infile("data1.txt",ios::in);
if (!infile)

cout<<" 文件打开失败! ";
exit(1);

stu p1;
infile.read(reinterpret_cast<char*>(&p1),sizeof(stu));
while(!infile.eof())

if(p1.name.compare(name4)==0)

p1.display();
break;

infile.read(reinterpret_cast<char*>(&p1),sizeof(stu));



int main()

stu a;
a.get();
a.display();
return 0;

网上查了据说是指向空指针的问题,但我实在没找到,求各位大大解惑!
if(p1.name.compare(name4)==0)

你这个程序是要验证什么? 用指针访问私有成员?

问题出在:

   infile.read(reinterpret_cast<char*>(&p1),sizeof(stu));

p1是类对象,被reinterpret_cast后,读入数据口,整个类对象的内存空间都被冲毁了。 类的对象,在内存空间中的布局包括成员及成员函数的指针(即函数名称所在的地址),一旦被当作普通指针进行了数据拷贝(上面的read),那么成员函数的地址也被改变了。后面p1.name.compare
(...),需要调用成员函数,而此时成员函数地址也被覆盖,当然也就成了野指针,程序因此崩溃了。

这也就是c++应用中,不能对class pointer实施memset()操作的原因。


正常的数据读入应该是:

infile >> p1.id >> p1.name >> p1.tel;

但id,name,tel都是私有,应该不能成功。

改成:

infile >> id >> name >> tel;

就可以了,但你定义的stu p1就失去了意义。。。。。 还是那句话,程序的目的是什么?

追问

我是不停想从文件中直接读取一个类的数据到p1中,然后比较p1.name和name4,找到和name4一样的,说白了就是查询,p1只是个临时对象
如果这样不行,那该怎样一次性读取一个类的数据到临时变量中呢?

追答

如果你只是要作比较,那么修改你的代码如下即可 【注:假设data1.txt的格式是 name id tel  一行这样的排列】:

void stu::newget() 

  string name4;
    cin>>name4;
    fstream infile("data1.txt",ios::in);
    if (!infile)
    
        cout<<" 文件打开失败! ";
     exit (1);
     

    while ( !infile.eof() ) 
     infile >> id >> name >> tel;
     if ( name.compare(name4) == 0 )  // 这是大小写敏感的比较!
      display();
      break;
     
    
     infile.close();

a) 你的get函数已经是类的成员了,不要再用一个临时类对象了,你的成员都是“私有”的,一个临时类的变量,无法直接存取这些私有成员(除非你的类提供访问接口,诸如: getName(),getId(), getTel())

b) 类中的display只为了get服务? 如果是这样,没必要public;你的主程序中get之后又display是什么用意呢(不是再get中已判断了吗? name匹配,才display,否则不应有输出才对)?

来自:求助得到的回答
参考技术A 可能是你在头文件.h里面定义了一个指针,然后有没有在主函数里面呢new出来,就直接使用了这个指针
例如:
widget.h
QDialog *login_dialog;
widget.cpp
//login_dialog = new QDialog; (忘了此步操作)
login_dialog->show();
忘了上面的new操作就会出现这种情况,使用了一个野指针。当然这只是其中一种可能,但是这种野指针的错误最为常见。

以上是关于qt 调试时出现的主要内容,如果未能解决你的问题,请参考以下文章

让 gprof 从 Qt 调试应用程序读取 gmon.out 输出时出现问题

在调试模式下编译时出现qrc_resource.cpp错误

qt调试时出现的错误:The inferior stopped because it received a signal from the Operating System.

获取 QString 时出现分段错误

构建 Qt 时出现编译器错误

使用图形函数时出现分段错误(vtk 6.1、Qt5.3、Ubuntu)