【问题标题】:ERROR :The thread 0x4c0c has exited with code 0 (0x0). Exception thrown: read access violation. **this** was nullptr错误:线程 0x4c0c 以代码 0 (0x0) 退出。抛出异常:读取访问冲突。 **this** 是 nullptr
【发布时间】:2020-08-07 10:06:14
【问题描述】:

对于我的一个 c++ 编程类,我们需要设计一个布尔数组类——包括长度和布尔数组以及内存分配, 我收到错误消息 - 线程 0x4c0c 已退出,代码为 0 (0x0)。 抛出异常:读取访问冲突。 这是 nullptr。

当我尝试使用 changeLength 方法创建新数组时出现:

BOOL 数组 H 文件

#ifndef BOOL_ARRAY_H
#define BOOL_ARRAY_H
class boolArray
{
public:
    boolArray() { array = { NULL }; length = 0; }
    boolArray(int len);//setting new array according users input
    void intialize(int len);//setting new array according users input
    void changeLength(int len);//create new array with new length
    
private:
    bool validIndex(int index);//check if the number is in the relevant range
    bool* array;
    int length;
};
#endif


布尔数组 CPP 文件

boolArray::boolArray(int len)
{//ctor with parameter
    if (validIndex(len))//checking if the length is a valid number
        intialize(len);//set the new array
}
void boolArray::intialize(int len)
{//setting new array according users input
    length = len;//initialize length from user
    array = new bool[length];//memory allocation
    if (!array)//check if memory allocation succeeded
    {
        cout << "memory allocation failed!" << endl;//show message
        return;//go back
    }
    for (int i = 0; i < length; i++)
        array[i] = 0;//set all cells false
}
void boolArray::changeLength(int len)
{//create new array with new length
    if (length!=0)//if array exists //ERROR HERE
        delete[] array;//free memory
    intialize(len);//set new array
}
bool boolArray::validIndex(int index)
{//check if the number is in the relevant range
    if (index >= 0 && index <= length)
        return true;//if it is returns true
    else//if not in the range
        cout << "please enter a valid number!" << endl;//message
    return false;//return false
}

主要使用布尔数组类---

boolArray* array;
int len;//new array length
        cout << "enter size of array " << endl;
        cin >> len;
        array->changeLength(len);

调试器: 谢谢!

【问题讨论】:

  • 当您使用调试器运行程序时,您看到了什么?这就是调试器的用途。如果您不知道如何使用调试器,这是一个学习如何使用调试器一次运行一行的好机会,监控所有变量及其值的变化,并分析程序的逻辑执行流程。知道如何使用调试器是每个 C++ 开发人员必备的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序以及您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。
  • 注意我已经添加了调试器的图像@SamVarshavchik
  • Sam 知道调试器长什么样。您需要对调试器执行的操作是单步执行代码,同时密切关注您正在使用的变量。在这种情况下,您需要回答“为什么是 this NULL?”这个问题。要做到这一点,你需要通过程序找到this 变成NULL 的位置,然后从你观察到的到达那里找出它是如何发生的。有时这需要重新启动调试器并更加注意程序早期发生的事情。该错误通常与程序崩溃的地方相去甚远。
  • 你可以对它更温柔,我不知道@987654330是什么@就是你我发布了它@user4581301
  • this 是所有非static 成员函数都有的实例变量。当您在对象上调用成员函数时,该对象在函数内显示为thisthis 的详细讨论将在任何非欺诈性 C++ 编程文本的早期出现。

标签: c++ arrays error-handling access-violation


【解决方案1】:

说实话,你有点幸运array 是空的。它可能是祖母家的任何东西,因为您忘记初始化它并将其指向boolArray 的有效实例。

boolArray* array; // uninitialized pointer
int len;//new array length
cout << "enter size of array " << endl;
cin >> len;
array->changeLength(len); // Crom only knows what array points at.

最直接的解决办法是根本不使用指针

boolArray array; // no need for a pointer here
int len;//new array length
cout << "enter size of array " << endl;
cin >> len;
array.changeLength(len);

但我更喜欢

int len;//new array length
cout << "enter size of array " << endl;
cin >> len;
boolArray array(len); // no need to resize.

然后你需要修复 David Schwartz 强调的错误——它非常糟糕——还有这个:

boolArray::boolArray(int len)
{//ctor with parameter
    if (validIndex(len)) //there is no length to validate against. 
                         // It hasn't been set yet.
        intialize(len); // length isn't set until in here
}

在构建数组之前检查数组访问的长度没有用,所以我将其删除。

boolArray::boolArray(int len)
{//ctor with parameter
    intialize(len);
}

还有一个警告:这个类不遵守the Rule of Three,不能安全复制。

【讨论】:

  • k 知道了,已经修复了 David Schwartz 提到的问题,一般来说我需要它能够改变它的大小(这就是内存分配的用途),据我所知,我不必初始化它(ctor 已经做到了)@user4581301
  • 指针的构造函数不做任何事情。您得到的只是一个变量,您可以使用它来指向命名类型的对象或从命名类型继承的类型。如果你放弃了指针,那么你就有了一个该类型的实例,它将被构造。
【解决方案2】:
array = new bool(length);//memory allocation

你的意思是new bool[length]

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2016-08-25
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2020-06-17
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多