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);
}