Я создаю программу для создания динамического c числа: char **. Функция удаления в C ++ является новой для меня, поэтому, возможно, я делаю некоторую ошибку basi c, для которой я не могу найти ответ в inte rnet.
Код работает и удаляет успешно Массивы в первый раз, но во второй раз я получил ошибку «Повреждение кучи».
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int addString(char*** mArr, char*** bArr, int& stringIndex);
int copyStrings(char*** mArr, char*** bArr, int stringIndex);
void deleteArr(char*** arr, int stringIndex);
using namespace std;
int main()
{
int stringChoice = 0/*USER CHOICE*/, stringIndex = 0;//HOW MANY STRINGS ARE CURRENTLY!
int searchIndex = 0;//HELP THE SEARCH FUNCTIONS 6 AND 7.
char** mArr = NULL;//MAIN ARRAY
char** bArr = NULL;//BETA ARRAY TO AVOID LOSE OF DATA.
cout << "Welecome to string menu, what do you want to do?" << endl;
while (stringChoice != 8)
{
cout << "\n1.Add a string\n"
<< endl;
cin >> stringChoice;
switch (stringChoice)
{
case 1:
addString(&mArr, &bArr, stringIndex);
for (int j = 0; j < stringIndex; j++)
cout << mArr[j] << endl;
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
}
}
int addString(char*** mArr, char*** bArr, int& stringIndex)
{
if (mArr != NULL)
{
copyStrings(mArr, bArr, stringIndex);//COPYING mArr TO bArr.
deleteArr(mArr, stringIndex);//DELETE EVERYTHING FROM mArr. AVOIDING MEMORY LEAK.
}
stringIndex++;//ADDING A STRING TO THE ARRAY.
*mArr = new char* [stringIndex];//ALLOCATING THE NEW SIZE AND CHECKING ALLOCATION.
if (*mArr == NULL)
return 0;
if (*bArr != NULL)//IF SOMETHING WAS COPIED FROM mArr TO bArr BEFORE.
{
for (int i = 0; i < stringIndex - 1; ++i)//COPYING bArr TO THE MAIN ARRAY!
{
*mArr[i] = new char(strlen(*bArr[i]) + 1);
if (*mArr[i] == NULL)
return 0;
else strcpy(*mArr[i], *bArr[i]);
}
deleteArr(bArr, stringIndex - 1);//DELETE EVERYTHING FROM bArr.
}
char checkLength[80];//BUUFER TO CHECK THE USER INPUT LENGTH.
cout << "Please enter your string!" << endl;
cin.ignore(1);//IGNORE BUFFER CHAR THAT WILL BE EQUAL TO - "ENTER".
cin.getline(checkLength, 80);
*mArr[stringIndex - 1] = new char[strlen(checkLength) + 1];//ALLOCATING THE LENGTH OF USER INPUT.
if (*mArr[stringIndex - 1] == NULL)// ADDING 1 FOR THE NULL TERMINATOR.
return 0;//CHECKING ALLOCATION.
strcpy(*mArr[stringIndex - 1], checkLength);
return 1;
}
int copyStrings(char*** mArr, char*** bArr, int stringIndex)
{
*bArr = new char* [stringIndex];//STRING INDEX IS HOW MUCH STRINGS WAS ADDED
if (*bArr == NULL)
return 0;
for (int i = 0; i < stringIndex; ++i)
{
*bArr[i] = new char(strlen(*mArr[i]) + 1);
if (*bArr[i] == NULL)
return 0;
strcpy(*bArr[i], *mArr[i]);
}
return 1;
}
void deleteArr(char*** arr, int stringIndex)
{
cout << "string index value: " << stringIndex << endl;
// for (int i = 0; i < stringIndex; i++)
// {
// cout << i << endl;
// cout << *arr[i] << endl;
// }
for (int i = 0; i < stringIndex; i++)
{
delete[] * arr[i];
cout << "DELETE " << stringIndex << endl;
}
delete[] * arr;
}
Я пытаюсь удалить массивы перед тем, как снова использовать NEW, чтобы избежать утечки памяти. В первый раз это работает как я сказал, но во второй раз ..... Для меня есть много печатных ссылок, так что просто игнорируйте, это всего лишь небольшая часть моего первого проекта C ++. Спасибо!