ОШИБКА: поток 0x4c0 c вышел с кодом 0 (0x0). Исключение: нарушение прав на чтение. ** это ** был nullptr - PullRequest
0 голосов
/ 24 апреля 2020

Для одного из моих классов программирования на c ++ мы должны спроектировать класс массива bool, включая длину и логический массив с выделением памяти, и я получаю сообщение об ошибке - Поток 0x4c0 c завершен с кодом 0 (0x0). Исключение: нарушение прав на чтение. это был nullptr.

возникает, когда я пытаюсь создать новый массив, используя changeLength метод:

BOOL ARRAY H FILE

#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


BOOL ARRAY CPP FILE

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
}

ОСНОВНОЕ ИСПОЛЬЗОВАНИЕ BOOL ARRAY CLASS ---

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

Отладчик: enter image description here СПАСИБО!

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Если честно, вам отчасти повезло 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.

Тогда вам нужно go Исправить ошибку, которую выделил Дэвид Шварц - Это намного, намного противнее - и вот это:

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

И предупреждение: этот класс не соблюдает Правило трех и не может быть безопасно скопирован.

0 голосов
/ 24 апреля 2020
array = new bool(length);//memory allocation

Вы имели в виду new bool[length].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...