Как правильно освободить динамическую память в этой простой программе на C++? Я получаю ошибку сегментации (дамп ядра) при выполнении программы. Я пытаюсь выяснить, где я ошибся. Заранее спасибо.
Я пытаюсь добавить динамически выделяемые объекты в массив и пытаюсь заставить деструктор очистить память. Я не уверен, правильно ли я создал деструктор в carList.
#include <iostream>
#define MAX 3
class Car{
public:
Car(std::string name){
this->name = name;
}
~Car(){
}
std::string getName(){
return this->name;
}
private:
std::string name;
};
class carList{
public:
carList(){
this->length = 0;
}
~carList(){
//the deconstructer; I am unsure If I have implemented it correctly
for (int i = 0; i < this->length; i++)
{
if (listCar[i] != nullptr){
delete[] listCar[i];
}
}
}
int getLength(){
return this->length;
}
// adding to the end of the list, unsure whether Implemented correctly
void addEndList(Car* car){ //???
if (this->length < MAX){
this->listCar[length+1] = car;
this->length++;
}
}
private:
Car* listCar[MAX];
int length;
};
int main(){
carList* carlist = new carList();
std::cout << carlist->getLength() <<std::endl;
Car* car2 = new Car("one");
Car* car3 = new Car("two");
carlist->addEndList(car2);
carlist->addEndList(car3);
std::cout << carlist->getLength() <<std::endl;
std::string name1 = car2->getName();
std::cout << name1 << std::endl;
delete carlist; // deleting the carlist, unsure if I need to delete car2,
//and car3 or if the destructor handles that, which I am
//trying to implement
return 0;
}
Вы только delete[]
то, что вы new[]
. Вы должны delete
то, что было выделено new
.
Индексы массива начинаются с 0
в C++. Так,
this->listCar[length+1] = car;
должно быть
this->listCar[length] = car;
В противном случае вы не инициализируете индекс 0
, а delete
его.
Вторая проблема связана с delete
. Вы должны использовать delete
для указателя, возвращаемого new
и delete[]
для new[]
. Вы использовали new
. Так,
delete[] listCar[i];
должно быть
delete listCar[i];
После этих двух изменений все выглядит нормально: https://godbolt.org/z/84M1fq1fv
Вы комбинируете версию
new
без массива с версией массиваdelete[]
. Это не разрешено. Более того, в C++ индексы начинаются с 0. ОтметьтеaddEndList
, когда будет добавлен первый элемент.