-1

コンストラクターがキーワードを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;
//    }
};
4

3 に答える 3

2

いいえ、デストラクタで削除しないでください。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デストラクタで削除する場合は、 の 2 つのインスタンスが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);
}
于 2012-11-18T17:43:32.080 に答える
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;
}
于 2012-11-18T19:12:46.750 に答える