Передача объектов, созданных new [] в класс, необходим деструктор для удаления?

Я не знаю, должен ли я создать деструктор для удаления членов 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;
//    }
};

-1

Решение

Нет, вы не должны удалять в деструкторе. 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);
}
2

Другие решения

В хорошем дизайне обычно объект, создавший объект, также отвечает за его освобождение. Учитывая это, либо освободи свою память от main() или выделить в конструкторе контроллера и освободить в деструкторе контроллера — выбор зависит от реальных требований.

0

Как насчет использования общих указателей тогда?

#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;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector