QT 写访问冲突
QT Write access violation
大家好,我正在尝试通过 QT 中的 cpp 中的过程编程来制作链接列表,每当我尝试向列表中添加内容时,我都会收到此错误:
c:\users\marcin\documents\dev cpp\proc_list\proc_list.cpp:11: error: Exception at 0x13fc325cb, code: 0xc0000005: write access violation at: 0x1, flags=0x0 (first chance)
从我已经读到的内容来看,问题应该是我尝试访问空指针,但已经尝试检查它并且看起来不错。这是错误的代码:
void append_rec(QString name, int age, int number, float balance, item *first){
item *newrec;
item *temp;
newrec = new item(this);
temp = new item;
newrec->next = NULL;
newrec->name = name;
newrec->number = number;
newrec->balance = balance;
newrec->age = age;
temp = first;
while(temp->next!= NULL)
temp = temp->next;
temp->next = newrec;
}
和问题(如调试器所说,在 newrec->next = NULL;
行中弹出。我刚开始学习 cpp,严重找不到解决方案。
编辑
项目结构代码(对于此作业,我不允许使用 类):
#ifndef PROC_LIST_H
#define PROC_LIST_H
#include <qstring.h>
struct item{
item *next;
QString name;
int age;
int number;
float balance;
};
void append_rec(QString name, int age, int number, float balance, item * first);
void display_list( item * first );
#endif // PROC_LIST_H
编辑 2
主 window 文件涵盖了我对列表所做的所有事情。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "proc_list.cpp"
item *first = NULL;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_front_add_clicked()
{
append_rec(ui->name_edit->text(),
ui->age_edit->text().toInt(),
ui->accnum_edit->text().toInt(),
ui->balance_edit->text().toFloat(),
first);
}
我首先注意到的是您提到了过程式编程,然后在函数中使用了 "this" 指针。只需将其删除。您甚至没有要使用 "item" 结构的构造函数。
其次,您执行 temp = new item
项,并在执行此后立即执行此 temp = first
。 BAM 内存泄漏。但这不是主要问题。
另请注意,您的列表基指针从一开始就是 NULL 并试图从您的 while 中取消引用其成员 temp->next
可能 return 垃圾结果并且可能评估为 true,即使它只是垃圾。
例如,STL 列表有一个 "end" 指针来避免这类事情,您也可以这样做。
希望我有所帮助!
编辑:
好吧,我设法用纯 C++ 解决了问题,但我可能做得过于复杂了。
我选择使用指向指针的指针,因为当列表为空时,我们将能够通过参数更改基指针。但是我认为这不是最佳解决方案,但它确实有效。请注意,您现在需要在从 main 调用时传递项目的地址。
#include <iostream>
using namespace std;
struct item{
item *next;
string name;
int age;
int number;
float balance;
};
void append_rec(string name, int age, int number, float balance, item** first){
item *newrec = new item;
newrec->next = NULL;
newrec->name = name;
newrec->number = number;
newrec->balance = balance;
newrec->age = age;
while(*first!= NULL) // The pointer we are pointing to isnt valid
first = &(*first)->next; // Point to the next pointer in the list
*first = newrec; // Change the value of the pointer we are pointing to
}
void display_list( item * first )
{
item* temp = first;
while ( temp != nullptr )
{
cout << temp->name << '\n';
cout << temp->number << '\n';
cout << temp->balance << '\n';
cout << temp->age << '\n';
cout << "<===================||=======================>";
temp = temp->next;
}
}
item *first = NULL;
int main()
{
append_rec("something 1", 1, 1, 1.f, &first);
append_rec("something 2", 2, 2, 2.f, &first);
append_rec("something 3", 3, 3, 3.f, &first);
append_rec("something 4", 4, 4, 4.f, &first);
display_list(first);
}
大家好,我正在尝试通过 QT 中的 cpp 中的过程编程来制作链接列表,每当我尝试向列表中添加内容时,我都会收到此错误:
c:\users\marcin\documents\dev cpp\proc_list\proc_list.cpp:11: error: Exception at 0x13fc325cb, code: 0xc0000005: write access violation at: 0x1, flags=0x0 (first chance)
从我已经读到的内容来看,问题应该是我尝试访问空指针,但已经尝试检查它并且看起来不错。这是错误的代码:
void append_rec(QString name, int age, int number, float balance, item *first){
item *newrec;
item *temp;
newrec = new item(this);
temp = new item;
newrec->next = NULL;
newrec->name = name;
newrec->number = number;
newrec->balance = balance;
newrec->age = age;
temp = first;
while(temp->next!= NULL)
temp = temp->next;
temp->next = newrec;
}
和问题(如调试器所说,在 newrec->next = NULL;
行中弹出。我刚开始学习 cpp,严重找不到解决方案。
编辑
项目结构代码(对于此作业,我不允许使用 类):
#ifndef PROC_LIST_H
#define PROC_LIST_H
#include <qstring.h>
struct item{
item *next;
QString name;
int age;
int number;
float balance;
};
void append_rec(QString name, int age, int number, float balance, item * first);
void display_list( item * first );
#endif // PROC_LIST_H
编辑 2
主 window 文件涵盖了我对列表所做的所有事情。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "proc_list.cpp"
item *first = NULL;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_front_add_clicked()
{
append_rec(ui->name_edit->text(),
ui->age_edit->text().toInt(),
ui->accnum_edit->text().toInt(),
ui->balance_edit->text().toFloat(),
first);
}
我首先注意到的是您提到了过程式编程,然后在函数中使用了 "this" 指针。只需将其删除。您甚至没有要使用 "item" 结构的构造函数。
其次,您执行 temp = new item
项,并在执行此后立即执行此 temp = first
。 BAM 内存泄漏。但这不是主要问题。
另请注意,您的列表基指针从一开始就是 NULL 并试图从您的 while 中取消引用其成员 temp->next
可能 return 垃圾结果并且可能评估为 true,即使它只是垃圾。
例如,STL 列表有一个 "end" 指针来避免这类事情,您也可以这样做。
希望我有所帮助!
编辑:
好吧,我设法用纯 C++ 解决了问题,但我可能做得过于复杂了。 我选择使用指向指针的指针,因为当列表为空时,我们将能够通过参数更改基指针。但是我认为这不是最佳解决方案,但它确实有效。请注意,您现在需要在从 main 调用时传递项目的地址。
#include <iostream>
using namespace std;
struct item{
item *next;
string name;
int age;
int number;
float balance;
};
void append_rec(string name, int age, int number, float balance, item** first){
item *newrec = new item;
newrec->next = NULL;
newrec->name = name;
newrec->number = number;
newrec->balance = balance;
newrec->age = age;
while(*first!= NULL) // The pointer we are pointing to isnt valid
first = &(*first)->next; // Point to the next pointer in the list
*first = newrec; // Change the value of the pointer we are pointing to
}
void display_list( item * first )
{
item* temp = first;
while ( temp != nullptr )
{
cout << temp->name << '\n';
cout << temp->number << '\n';
cout << temp->balance << '\n';
cout << temp->age << '\n';
cout << "<===================||=======================>";
temp = temp->next;
}
}
item *first = NULL;
int main()
{
append_rec("something 1", 1, 1, 1.f, &first);
append_rec("something 2", 2, 2, 2.f, &first);
append_rec("something 3", 3, 3, 3.f, &first);
append_rec("something 4", 4, 4, 4.f, &first);
display_list(first);
}