【C++】new演算子で初期化する方法【構造体/クラス/配列の初期化方法を解説】

この記事では、C++のnew演算子を使って様々なオブジェクトを初期化する方法と、初期化する際の注意点について解説します。

new演算子を使って配列、構造体、クラス、およびクラスのメンバーを初期化する方法を学び、メモリリークの防止やデストラクタの呼び出しについて理解することができるでしょう。

目次から探す

new演算子とは

new演算子は、C++プログラミング言語において、動的なメモリの割り当てを行うために使用される演算子です。

通常、プログラムの実行時に必要なメモリを静的に確保するのではなく、必要な時に動的にメモリを確保することができます。

new演算子を使って様々なオブジェクトを初期化する

new演算子は、動的にメモリを確保し、オブジェクトを初期化するために使用されます。

以下では、配列、構造体、クラス、およびクラスのメンバーの初期化方法について説明します。

配列の初期化

配列をnew演算子を使用して初期化するには、以下のように記述します。

int* arr = new int[5];

上記の例では、int型の要素を5つ持つ配列を動的に確保しています。

配列の要素数を指定する際には、要素の型の後ろに[]を付けて指定します。

構造体の初期化

構造体をnew演算子を使用して初期化するには、以下のように記述します。

struct Person {
    std::string name;
    int age;
};
Person* person = new Person;
person->name = "John";
person->age = 25;

上記の例では、Personという構造体を動的に確保し、nameとageのメンバーに値を代入しています。

クラスの初期化

クラスをnew演算子を使用して初期化するには、以下のように記述します。

class Car {
public:
    std::string brand;
    int year;
};
Car* car = new Car;
car->brand = "Toyota";
car->year = 2020;

上記の例では、Carというクラスを動的に確保し、brandとyearのメンバーに値を代入しています。

クラスのメンバーの初期化

クラスのメンバーをnew演算子を使用して初期化するには、以下のように記述します。

class Rectangle {
public:
    int width;
    int height;
};
class Shape {
public:
    Rectangle* rect;
};
Shape* shape = new Shape;
shape->rect = new Rectangle;
shape->rect->width = 10;
shape->rect->height = 5;

上記の例では、Shapeというクラスを動的に確保し、そのメンバーであるrectをRectangleというクラスのインスタンスとして動的に確保しています。

そして、rectのwidthとheightに値を代入しています。

以上が、new演算子を使用して配列、構造体、クラス、およびクラスのメンバーを初期化する方法の例です。

new演算子を使うことで、動的なメモリ確保とオブジェクトの初期化を行うことができます。

ただし、使用後は必ずdelete演算子を使用してメモリを解放することを忘れないようにしましょう。

new演算子で初期化する際の注意点

new演算子を使用してオブジェクトを初期化する際には、いくつかの注意点があります。

以下では、メモリリークの防止とデストラクタの呼び出しについて解説します。

メモリリークの防止

new演算子を使用してオブジェクトを動的に生成すると、そのオブジェクトのためにメモリが確保されます。

しかし、オブジェクトを使用し終わった後にそのメモリを解放しないままにしてしまうと、メモリリークが発生します。

メモリリークは、プログラムの実行中に使用されなくなったメモリが解放されずに残り続けることで、メモリの使用量が増え続ける問題です。

メモリリークを防止するためには、new演算子で確保したメモリをdelete演算子を使用して解放する必要があります。

delete演算子を使用することで、オブジェクトが使用していたメモリが解放され、プログラムの実行中に使用されなくなったメモリが解放されます。

以下は、new演算子で生成したオブジェクトをdelete演算子で解放する例です。

int* ptr = new int; // int型のオブジェクトのためのメモリを確保
// オブジェクトを使用する処理
delete ptr; // メモリを解放

デストラクタの呼び出し

new演算子を使用して生成したオブジェクトは、そのオブジェクトの寿命が終わった時に自動的にデストラクタが呼び出されます。

デストラクタは、オブジェクトが破棄される際に行うべき後処理を行うための特殊なメンバ関数です。

デストラクタは、オブジェクトが生成された順序の逆順で呼び出されます。

つまり、new演算子で生成したオブジェクトを解放する際には、そのオブジェクトのデストラクタが呼び出されることになります。

以下は、クラスのコンストラクタとデストラクタの例です。

class MyClass {
public:
    MyClass() {
        // コンストラクタの処理
    }
    
    ~MyClass() {
        // デストラクタの処理
    }
};
MyClass* obj = new MyClass; // MyClass型のオブジェクトを生成
// オブジェクトを使用する処理
delete obj; // オブジェクトを解放し、デストラクタが呼び出される

デストラクタは、オブジェクトが解放される際に必要な後処理を行うため、リソースの解放やメモリの解放などを行うことがあります。

適切なデストラクタの実装を行うことで、プログラムの安全性や効率性を向上させることができます。

以上が、new演算子で初期化する際の注意点です。

メモリリークの防止とデストラクタの呼び出しについて理解し、適切なプログラミングを行いましょう。

目次から探す