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

C++でnewを使ってオブジェクトを生成する場合と、newを使わずに生成する場合の違いとは?

C++では、クラスのオブジェクトを生成する方法として、「newキーワードを使う方法」と「newキーワードを使わない方法」の2通りがあります。

newを使わずに生成した場合、そのオブジェクトは通常の自動変数として扱われ、スタック領域に格納されます。この場合、宣言されたスコープ(ブロックや関数)が終了すると、オブジェクトは自動的に破棄されるため、メモリ管理の手間がかかりません。

一方、オブジェクトのサイズが実行時まで確定しない場合や、スコープを超えてオブジェクトを生存させたい場合には、動的にメモリを確保する必要があります。その際は、クラスへのポインタを作成し、new演算子を使ってインスタンスを生成します。newによって確保されたメモリはヒープ領域に割り当てられ、明示的にdeleteを呼び出すまで解放されません。

つまり、C++におけるnewは「動的メモリ確保」を行うための演算子です。

サンプルコード

#include <iostream>
using namespace std;
class Point {
    int x, y, z;
    public:
        Point(int x, int y, int z) {
            this->x = x;
            this->y = y;
            this->z = z;
        }
        void display() {
            cout << "(" << x << ", " << y << ", " << z << ")" << endl;
        }
};
int main() {
    Point p1(10, 15, 20);   // スタック上に生成
    p1.display();
    Point *ptr;             // クラスへのポインタを宣言
    ptr = new Point(50, 60, 70);  // ヒープ上に動的に生成
    ptr->display();
    delete ptr;             // メモリを明示的に解放
}

出力結果

(10, 15, 20)
(50, 60, 70)

コードの解説

  • p1はnewを使わずに生成されたオブジェクトであり、main関数のスコープが終了すると自動的に破棄されます。
  • ptrはnew演算子によってヒープ領域に生成されたオブジェクトを指すポインタです。使用後はdeleteを呼び出してメモリを解放する必要があります。

注意点

newで確保したメモリをdeleteせずに放置すると、メモリリークが発生します。現代のC++では、std::unique_ptrstd::shared_ptrといったスマートポインタを使うことで、メモリの自動解放を実現でき、より安全なコードを書くことができます。

  1. C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

    動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ

  2. C++における「宣言」と「定義」の違いとは?具体例でわかりやすく解説

    C++を学んでいると、「宣言(declaration)」と「定義(definition)」という2つの用語が頻繁に登場します。この2つはよく混同されがちですが、実際には明確な違いがあります。本記事では、その違いを具体例とともにわかりやすく解説します。 宣言(Declaration)とは? 宣言とは、プログラム内で使用する変数、ユーザー定義型、関数について、その型やサイズ(関数の場合は戻り値の型や引数の型・数)をコンパイラに事前に伝えることです。 重要なポイントは、宣言の段階ではメモリ上に領域が確保されないという点です。コンパイラに対して「この名前の変数や関数が後で登場しますよ」と知らせるだけの