Программа перестает работать при использовании delete-оператора - PullRequest
0 голосов
/ 02 февраля 2019

Я новичок в использовании операторов удаления, и меня немного смущает, почему моя программа продолжает падать, когда я пытаюсь удалить элемент из массива указателей.Сбой при обоих удалениях, я закомментировал другой цикл for для проверки этого.

int main()
{
    char ** str_array = nullptr;
    char * str = nullptr;
    char delimiter = ' ';
    int arraySize = 0;

    str = new char [51];

    cout << "Enter a string" << endl;
    cin.clear();
    cin.ignore( cin.rdbuf() -> in_avail() );
    cin.getline(str, 50);
    cin.clear();

    arraySize = StrToArray(str_array, str, delimiter);

    for (int i = 0; i < arraySize; i++)
    {
        cout << str_array[i] << endl;
    }

    for (int i = 0; i < arraySize; ++i)
    {
        delete [] str_array[i];
    }
    delete [] str_array;

    return 0;
}

Вот функция, которую я использую для инициализации str_array.

int StrToArray(char **& str_array, char * str, char delimiter)
{
    int size = 0;
    int arraySize = 0;
    int start = 0;
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == ' ') 
        {
            size++;
            if (str[i + 1] == '\0' || str[i + 1] == ' ')
            {
                size--;
            }
        }
    }

    str_array = new char * [size];

    for (int i = 0; i < strlen(str) + 1; i++)
    {
        if ((str[i] == ' ' || str[i] == '\0') && !(str[i + 1] == '\0' || str[i + 1] == ' '))
        {
            str_array[arraySize] = new char[i-start];
            arraySize++;
            for (int x = 0; x <= i - start; x++)
            {
                str_array[arraySize-1][x] = str[x + start];

                if (x == i-start)
                {
                    str_array[arraySize - 1][x] = '\0';
                }
            }

            i++;
            start = i;
        }

    }
    return (size + 1);
}

My str_arrayинициализируется как массив указателей, и каждый указатель указывает на cString.То, что я пытаюсь сделать, это удалить каждый элемент массива, а затем удалить сам массив.Однако каждый раз, когда я пытаюсь выполнить любой из операторов delete, мой код вылетает.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Я вижу две ошибки, обе ошибки 'off by one'

       str_array[arraySize] = new char[i-start];

должно быть

       str_array[arraySize] = new char[i-start+1];

Вы не оставили достаточно места для нулевого терминатора.

И

str_array = new char * [size];

должно быть

str_array = new char * [size+1];

, потому что количество пробелов на один меньше количества слов.

Я проверил с помощью "приветworld ", и с этими двумя изменениями твой код запустился для меня.

О, и исправление, сделанное Алихандро, также верно, но для меня это не вызвало никакого сбоя.

0 голосов
/ 02 февраля 2019

Оба ваших str_array и str_array[i] - это массив, вы должны использовать оператор delete[] для их освобождения.См. Простой пример ниже.

void f(size_t size)
{
    char** str_array = new char* [size];
    for (int i = 0; i < size; ++i) {
        str_array[i] = new char[i];
    }

    for (int j = 0; j < size; ++j) {
        delete[] str_array[j];
    }

    delete[] str_array;
}
...