gpt4 book ai didi

C++ 异常抛出 : read access violation. 这是 nullptr

转载 作者:太空狗 更新时间:2023-10-29 20:02:46 26 4
gpt4 key购买 nike

对于我的一门编程课,我们需要设计一个程序,该程序可以通过我们的讲师自己编写的提供的“压力测试”运行。

我们正在使用节点和链表,但其方式与我看过的有关该主题的任何 YouTube 视频都不同。

在过去的几天里,我一直在绞尽脑汁试图找出我的程序出了什么问题,但我没有运气。

这是我的 Node.cpp 文件的代码(不包括 Node.h)

#include "Node.h"

Node::Node() {
m_value = 0;
m_next = nullptr;
}

void Node::setValue(int val) {
m_value = val;
}

int Node::getValue() const {
return m_value;
}

void Node::setNext(Node* prev) {
m_next = prev;
}

Node* Node::getNext() const {
return m_next;
}

这是我的LinkedList.cpp

#include <iostream>
#include <vector>
#include "LinkedList.h"

LinkedList::LinkedList() {
m_front = nullptr;
m_size = 0;
}

LinkedList::~LinkedList() {
// Deconstructor
m_size = 0;
Node* a = m_front;
Node* b = a->getNext();
while (a->getNext() != NULL) {
delete a;
a = b;
b = b->getNext();
}
delete a;
a = NULL;
}

bool LinkedList::isEmpty() const{
if (m_size == 0) {
return true;
}
else {
return false;
}
}

int LinkedList::size() const {
return m_size;
}

bool LinkedList::search(int value) const {
if (m_size == 0) {
return false;
}
else if (m_size == 1) {
if (m_front->getValue() == value) {
return true;
}
else {
return false;
}
}
else {
Node* a = m_front;

for (int i = 0; i < m_size; i++) {
if (a->getValue() == value) {
return true;
}
else {
a = a->getNext();
}
}
return false;
}
}

void LinkedList::printList() const {
std::cout << "List: ";
if (m_size == 0) {
// Print Nothing
}
else if (m_size == 1) {
std::cout << m_front->getValue();
}
else {
Node* a = new Node();
a = m_front;
int b = m_front->getValue();
std::cout << b << ", ";

while (a->getNext() != NULL) {
a = a->getNext();

if (a->getNext() == NULL) {
std::cout << a->getValue();
}
else {
std::cout << a->getValue() << ", ";
}
}
}
std::cout << std::endl;

}

void LinkedList::addBack(int value) {
Node* a = new Node();
a->setValue(value);
if (m_size == 0) {
m_front = a;
}
else {
Node* b = new Node();
b = m_front;
while (b->getNext() != NULL) {
b = b->getNext();
}
b->setNext(a);
}
m_size++;
}

void LinkedList::addFront(int value) {
Node* a = new Node(); // Check later

a->setNext(m_front);
a->setValue(value);
m_front = a;
m_size++;

}

bool LinkedList::removeBack() {
if (m_size == 0) {
return false;
}
else {
Node* a = new Node();
Node* b = new Node();
a = m_front;
while (a->getNext() != NULL) {
b = a;
a = a->getNext();
}
b->setNext(nullptr);
delete a;
a = NULL;
m_size--;
return true;
}
}

bool LinkedList::removeFront() {
if (m_size == 0) {
return false;
}
else {
Node* a = new Node();
a = m_front;
m_front = m_front->getNext();
delete a;
a = NULL;
m_size--;
return true;
}
}
std::vector<int> LinkedList::toVector() const {
if (m_size == 0) {
std::vector<int> b;
return b;
}
else {
std::vector<int> a(m_size);
Node* b = new Node();
b = m_front;
for (int i = 0; i < m_size; i++) {
a[i] = b->getValue();
b = b->getNext();
}
return a;
}
}

基本上,我已经自己测试了我的程序,我已经能够制作一个链表并运行我所有的添加和删除函数并打印出列表。我的问题是我运行了我们的讲师给我们的测试,在我遇到问题的时候看起来像这样(那些打印消息在另一个文件中,但它们似乎所做的只是打印传递的字符串参数)

int score = 0;
const int MAX_SCORE = 90;

std::cerr << "\n\n=========================\n";
std::cerr << " RUNNING TEST SUITE \n";
std::cerr << "=========================\n\n";

//Run test and award points where appropriate
score += test1() ? 2 : 0;
score += test2() ? 2 : 0;
score += test3() ? 3 : 0;

这持续了 18 次测试,但我的程序从未“成功”通过第一个测试。它通过了第一个测试,然后突然抛出一个错误。

bool Test_LinkedList::test1()
{
LinkedList list;
bool isPassed = false;

printTestMessage("size of empty list is zero");

isPassed = list.size() == 0;
printPassFail(isPassed);

return (isPassed);
}

我实际上在它崩溃之前得到了这个输出

=========================
RUNNING TEST SUITE
=========================

Test 1: size of empty list is zero: PASSED

所以它通过了第一个测试,但从未成功。我的意思是我已经尝试在周围添加 cout 消息

score += test1() ? 2 : 0; 
std::cout << "Done with test 1"
score += test2() ? 2 : 0;
score += test3() ? 3 : 0;

但是那永远不会输出。相反,我的程序中断了,Visual Studio 弹出一条消息说

Exception thrown: read access violation.

this was nullptr.

If there is a handler for this exception, the program may be safely continued.

然后它指出我在 Node.cpp 中的方法是

Node* Node::getNext() const {
return m_next;
}

抱歉,我知道要通读的文字很多,但现在我已经被难住了,我没有时间上类,因为明天早上要交作业。

编辑:我尝试省略第一个测试并运行它。它通过了接下来的 6 次测试,但在第 7 次(第 8 次)失败并出现完全相同的错误。

bool Test_LinkedList::test8()
{
LinkedList list;
bool isPassed = false;

printTestMessage("search returns false on empty list");

isPassed = !list.search(42);
printPassFail(isPassed);
return (isPassed);
}

最佳答案

LinkedList 析构函数有几个问题。首先,将 m_size 设置为 0 并将 a 设置为 NULL 是没有意义的,因为它们最终都会消失的析构函数。更重要的是,当列表为空时,代码将尝试取消引用空指针:

Node* a = m_front; // okay, gets that head pointer
Node* b = a->getNext(); // bang!!

这是一种更简洁的写法:

Node* a = m_front;
while (a != NULL) {
Node *temp = a->getNext();
delete a;
a = temp;
}

关于C++ 异常抛出 : read access violation. 这是 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35542007/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com