C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のnew演算子はいつ使う?使うべきケースと使い分けのポイント

C++におけるnew演算子は、ヒープ領域への動的なメモリ割り当てを要求するために使用します。十分な空きメモリがあれば、指定された型のメモリを確保・初期化し、その先頭アドレスをポインタ変数へ返します。

new演算子を使うべきケースとは?

new演算子を使うかどうかの判断基準はシンプルです。「deleteが呼び出されるまでオブジェクトをメモリ上に保持しておきたい場合」にのみnewを使用します。

逆にnewを使わずに通常の方法でオブジェクトを宣言した場合、そのオブジェクトはスコープ(有効範囲)を抜けた時点で自動的に破棄されます。つまり、以下のような違いがあります。

  • newで生成したオブジェクト: 手動でdeleteを呼び出して解放する必要がある
  • 通常のオブジェクト: スコープを抜けると自動的に解放される

new演算子の基本構文

pointer_variable = new datatype;

この構文では、pointer_variableは割り当てられたメモリアドレスを受け取るポインタ変数、datatypeは組み込みデータ型などを指します。

new演算子の使用例

以下のプログラムは、new演算子の実際の使い方を示したものです。

サンプルコード

#include <iostream>
using namespace std;
int main () {
    int *ptr1 = NULL;
    ptr1 = new int;
    float *ptr2 = new float(223.324);
    *ptr1 = 28;
    cout << "Value of pointer variable 1 : " << *ptr1 << endl;
    cout << "Value of pointer variable 2 : " << *ptr2 << endl;
    delete ptr1;
    delete ptr2;
    return 0;
}

実行結果

Value of pointer variable 1 : 28
Value of pointer variable 2 : 223.324

プログラムの解説

このプログラムでは、まずnew演算子によってint型とfloat型のメモリをそれぞれ確保し、そのアドレスをポインタ変数ptr1ptr2に格納しています。float型の変数では、宣言時に初期値223.324を渡して初期化しています。

次に、各ポインタが指すメモリ位置に保存された値を出力しています。最後に、delete演算子を使って確保したメモリを明示的に解放しています。これによりメモリリークを防ぐことができます。

該当するコード部分は以下の通りです。

int *ptr1 = NULL;
ptr1 = new int;
float *ptr2 = new float(223.324);
*ptr1 = 28;
cout << "Value of pointer variable 1 : " << *ptr1 << endl;
cout << "Value of pointer variable 2 : " << *ptr2 << endl;
delete ptr1;
delete ptr2;

まとめ

new演算子は、オブジェクトの生存期間をプログラマが制御したい場合に便利な機能です。ただし、newで確保したメモリは必ずdeleteで解放する責任が伴います。不要になったタイミングで適切に解放しないとメモリリークにつながるため、使用時には注意が必要です。

  1. C++のnew演算子で確保したメモリを初期化する方法

    C++のnew演算子は、メモリの「割り当て」を行うためのものであり、「初期化」まで自動的に行うものではありません。しかし、int型の配列をnewで動的に確保し、すべての要素をデフォルト値(intの場合は0)で初期化したい場合には、次のような構文を使用できます。基本構文:デフォルト初期化new int[10]();ポイントは、型名の後に空のかっこ () を付けることです。これにより、確保されたすべての要素がデフォルト初期化(ゼロクリア)されます。なお、この書き方では (0) のように具体的な値を指定したり、他の式を渡したりすることはできません。あくまで「デフォルト値での初期化」専用の構文である点

  2. C++のポインタ演算子*とは?間接参照演算子の基礎と使い方を解説

    C++の2つのポインタ演算子C++には、ポインタを操作するための演算子として、アドレス演算子(&)と間接参照演算子(*)の2つが用意されています。ポインタとは、別の変数のアドレス(メモリ上の場所)を格納する変数のことです。つまり、他の変数のアドレスを保持している変数は、その変数を「指し示している(ポイントしている)」と表現されます。ポインタが指し示す対象は、オブジェクトや構造体、さらにはポインタ自身を含む、あらゆるデータ型が可能です。間接参照演算子(*)とは間接参照演算子(*)は、アドレス演算子(&)と対になる演算子です。単項演算子の一種で、オペランドに指定されたアドレスに格納