Я не знаю, должен ли я создать деструктор для удаления членов Controller
которые устанавливаются на параметры, передаваемые main, которые создаются динамически, потому что конструктор никогда не использовал new
Ключевое слово, чтобы установить их.
int main()
{
int numCars = 3;
int numPlanes = 3;
Machine *car= new Car[numCars];
Machine *plane = new Plane[numPlanes];
Controller *control = new Controller(car, plane);
delete control;
return 0;
}
class Controller
{
public:
Controller(Machine *car, Machine *plane);
//Would I need to make a destructor
//~Controller();
private:
Machine *car;
Machine *plane;
Controller :: Controller(Machine *car, Machine *plane)
{
this->car = car;
this->plane = plane;
changeCarandPlane();
}
//destructor
// Controller :: ~Controller()
// {
// delete[] car;
// delete[] plane;
// }
};
Нет, вы не должны удалять в деструкторе. main
похоже, владеет выделенными массивами, поэтому удалите из main
,
int main()
{
int numCars = 3;
int numPlanes = 3;
Machine *car= new Car[numCars];
Machine *plane = new Plane[numPlanes];
Controller *control = new Controller(car, plane);
delete control;
delete [] plane;
delete [] car;
return 0;
}
Если вы должны были удалить в Controller
деструктор, вы должны убедиться, что нет двух экземпляров Controller
указывают на то же динамически распределяемый Machine
массивы.
Вы должны рассмотреть возможность использования std::vector<Machine>
вместо динамически распределяемых массивов или, по крайней мере, некоторых защитников области действия, чтобы гарантировать удаление.
#include <vector>
int main()
{
const int numCars = 3;
const int numPlanes = 3;
std::vector<Machine> cars(numCars); // holds 3 default constructed Machines
std::vector<Machine> planes(numPlanes); // holds 3 default constructed Machines
Controller control(cars, planes);
}
В хорошем дизайне обычно объект, создавший объект, также отвечает за его освобождение. Учитывая это, либо освободи свою память от main()
или выделить в конструкторе контроллера и освободить в деструкторе контроллера — выбор зависит от реальных требований.
Как насчет использования общих указателей тогда?
#include <memory>
class Machine {};
class Car : public Machine{};
class Plane : public Machine{};
template<typename T>
struct ArrayDeleter
{
void operator()(T* p)
{
delete [] p;
}
};
class Controller
{
public:
Controller(std::shared_ptr<Car> cars, std::shared_ptr<Plane> planes)
{}
};
int main()
{
int numCars = 3;
int numPlanes = 3;
std::shared_ptr<Car> cars(new Car[numCars], ArrayDeleter<Car>());
std::shared_ptr<Plane> planes(new Plane[numPlanes], ArrayDeleter<Plane>());
Controller *control = new Controller(cars, planes);
delete control;
return 0;
}