「newとdelete」の版間の差分

提供: C++入門
移動: 案内検索
(アロー演算子)
行40: 行40:
 
using namespace std;
 
using namespace std;
 
class Foo {
 
class Foo {
public:
+
        public:
int m_i;
+
                int m_i;
Foo (int i) m_i(i): { }
+
                Foo (int i) :m_i(i) { }
~Foo () {}
+
                ~Foo () {}
void show () {
+
                void show () {
cout << m_i << endl;
+
                        cout << m_i << endl;
}
+
                }
 
};
 
};
 
int
 
int
 
main (int argc, char *argv[]) {
 
main (int argc, char *argv[]) {
Foo *p = Foo(3);
+
        Foo *p = new Foo(3);
p->m_i += 20;
+
        p->m_i += 20;
p->show ();
+
        p->show ();
return 0;
+
        delete p;
 +
        return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

2014年1月3日 (金) 16:40時点における版

C++ の new 演算子 と delete 演算子は、メモリの動的な確保と解放に使用します。

読み方

new
にゅー
delete
でりーと

概要

new と delete は、 C言語 における malloc() と free() の関係に似ています。 new でメモリを確保した場合、使い終わったら、明示的に delete で解放しなければなりません。 new は、ポインタを返します。

new を呼び出すと、型のコンストラクタが呼び出されます。delete を呼び出すと、デストラクタが呼び出されます。 malloc()/free() を使用した場合、コンストラクタとデストラクタが呼び出されません。 そのため C++ では、malloc()/free() を基本的に利用しません。

メモリの管理には、スマートポインタを利用するのがお勧めです。スマートポインタは、メモリの解放忘れを防ぎ、メモリリークを抑制します。

メモリの確保と解放

int *p = new int(30);	// 確保と初期化
*p += 20;
cout << *p << endl;
delete p;		// 解放

配列の確保と解放

int *p = new int[10];	// 確保
p[0] = 30;
cout << p[0] << endl;
delete [] p;		// 解放

アロー演算子

ポインタでインスタンスをポインタで操作する場合、メンバ変数やメンバ関数のアクセスには、アロー演算子(->)を利用します。

#include <iostream>
using namespace std;
class Foo {
        public:
                int m_i;
                Foo (int i) :m_i(i) { }
                ~Foo () {}
                void show () {
                        cout << m_i << endl;
                }
};
int
main (int argc, char *argv[]) {
        Foo *p = new Foo(3);
        p->m_i += 20;
        p->show ();
        delete p;
        return 0;
}

関連項目