Я пытаюсь избавиться от утечек памяти в моем коде, но в любом случае я пытаюсь разыменовать указатели, это дает ошибку.Как удалить массив указателей в C++?
Код выглядит следующим образом:
ехр [] объявляется следующим образом в абстрактном классе Expression с конкретными подклассами: Binary, Constant и Бревенчатые следующим образом: статическое выражение * ехр []; который затем устанавливается в NULL в исходном файле выражения: Выражение * Выражение :: exp [] = {NULL};
Когда я закомментировать удаления б, удалить л и удалить со, программа работает нормально, но я подозреваю, что это оставляет утечку памяти
int main(void)
{
char userInput='j';
while (userInput != 'q' && userInput != 'Q')
{
cout <<endl<<"Menu:" << endl<<"r - Reset the PC"<<endl<<"x - Enter a new value for register x"<<endl<<"y - Enter a new value for register y"<<endl<<"z - Enter a new value for register x"<<endl<<"s - Step by step execution"<<endl<<"e - Complete execution"<<endl<<"d - Display expressions"<<endl<<"q - Quit"<<endl;
cin >> userInput;
//Reset condition
if (userInput == 'r' || userInput == 'R')
{
debugPos=0;
//Opening file and reading it line by line
ifstream test("program.txt");
string line;
while (getline(test, line))
{
//Removing spaces from the string
std::remove(line.begin(), line.end(), ' ');
//Check if it is a log type statement and create an object of Log if it is
if(line[2]=='l' || line[2]=='L')
{
Log *l = new Log(line);
Expression::exp[Expression::count]= l;
Expression::count++;
delete l;
}
//Check if it is a binary type statement and create an object of Binary if it is
else if(line[2]=='x' || line[2]=='y' || line[2]=='z' || line[2]=='X' || line[2]=='Y' || line[2]=='Z')
{
Binary *b = new Binary(line);
Expression::exp[Expression::count]= b;
Expression::count++;
delete b;
}
//Else create an object of Constant type
else
{
Constant *co = new Constant(line);
Expression::exp[Expression::count]= co;
Expression::count++;
delete co;
}
}
test.close();
cout<<endl<<"The expressions are read from the file"<<endl;
}
//Complete execution
else if (userInput == 'e' || userInput == 'E')
{
Expression::nExecute();
cout<<endl<<"Value of X: "<<Expression::X<<endl<<"Value of Y: "<<Expression::Y<<endl<<"Value of Z: "<<Expression::Z<<endl;
}
//Quit condition
else if (userInput == 'q' || userInput == 'Q')
{
cout<<endl<<"Thanks for using the calculator"<<endl;
break;
}
else
{
cout<<endl<<"Choose from the menu please"<<endl;
}
}
return 0;
}
Кроме того, в состоянии сброса, я пытаюсь сбросить указатели в NULL, так что я могу начать читать новые выражения из файла, но я не в состоянии установить массив, чтобы указать на NULL
Если вы уверены, что вам нужно указатели, использовать смарт-указатели. – chris
@chris Или «если вы уверены, что вам нужны указатели, используйте« вектор ». : P –
Посмотрите функции 'toupper' и' tolower', поэтому вам не нужно сравнивать буквы дважды. –