Моя программа падает, когда я пытаюсь удалить указатель - PullRequest
0 голосов
/ 30 января 2019

Всякий раз, когда я пытаюсь удалить указатель, я получаю «шум ошибки Windows», а затем моя программа просто зависает, но никогда официально не падает.

void addIngredient(char ** & ingredients, int & numOfIng)
{
    char * str = nullptr;

    char **tempArr = new char*[numOfIng];
    numOfIng++;

    //init tempArr to nullptr
    for (int i = 0; i < numOfIng; i++)
    {
        tempArr[i] = nullptr;
    }

    //set the new array to the old array
    for (int i = 0; i < numOfIng - 1; i++)
    {
        tempArr[i] = new char;
        tempArr[i] = ingredients[i];
    }

    delete [] ingredients;

    //point the old array to the new one 
    ingredients = tempArr;

    //add the new element to the end of the old array
    cout << "What new ingredient would you like to add? ";
    str = new char[25];
    cin >> str;
    ingredients[numOfIng - 1] = str;
    delete str;

    //method tought to us in class on how to clear array and what is being pointers within the array
    for (int i = 0; i < numOfIng; ++i)
    {
        delete [] tempArr[i]; //Freezes here
    }
    delete [] tempArr;
}

Я ожидаю удаления элементов массива, а затемудаление указателя на этот массив, но когда я его запускаю, я получаю шум ошибки стандартных окон, и моя программа зависает, пока я не нажму ctrl + c в окне консоли.Новичок в кодировании, поэтому, пожалуйста, не расстраивай меня слишком сильно.Не уверен, что это важно, но я использую Visual Studio 2017 и отлаживаю в x86.

1 Ответ

0 голосов
/ 30 января 2019

Вы выделяете объект (char), а затем забываете новый объект:

tempArr[i] = new char;
tempArr[i] = ingredients[i];

То, что вы хотите сделать, это установить вместо этого данные:

tempArr[i] = new char;
*(tempArr[i]) = *(ingredients[i]);

Этокак новый персонаж не теряется.

У вас также есть другая проблема, когда вы делаете delete [] ingredients;, вы не удаляете базовые указатели.Затем вы позже удаляете временные подмассивы (delete [] tempArr[i]), поэтому вам следовало бы сделать следующее:

for (int i = 0; i < numOfIng; ++i)
{
    delete ingredients[i]; // Note that I remove the [], as you have only new char, not new char[1]
}

И потом не удалять, поскольку новый ingredients использует эти "старые" tempArr.

Также рассмотрите возможность использования векторов или уникальных указателей для вашего случая.

...