「newとdelete」の版間の差分

提供: C++入門
移動: 案内検索
行1: 行1:
<!--
 
vim: filetype=mediawiki
 
-->
 
 
 
[[C++]] の new 演算子 と delete 演算子は、メモリの動的な確保と解放に使用します。
 
[[C++]] の new 演算子 と delete 演算子は、メモリの動的な確保と解放に使用します。
  
読み方
+
'''読み方'''
; new : にゅー
+
;new:にゅー
; delete : でりーと
+
;delete:でりーと
  
 
__TOC__
 
__TOC__
  
 
== 概要 ==
 
== 概要 ==
 
 
new と delete は、 [[C言語]] における malloc() と free() の関係に似ています。
 
new と delete は、 [[C言語]] における malloc() と free() の関係に似ています。
 
new でメモリを確保した場合、使い終わったら、明示的に delete で解放しなければなりません。
 
new でメモリを確保した場合、使い終わったら、明示的に delete で解放しなければなりません。
行21: 行16:
 
そのため [[C++]] では、malloc()/free() を基本的に利用しません。
 
そのため [[C++]] では、malloc()/free() を基本的に利用しません。
  
== メモリの確保と解放 ==
+
メモリの管理には、[[スマートポインタ]]を利用するのがお勧めです。[[スマートポインタ]]は、メモリの解放忘れを防ぎ、[[メモリリーク]]を抑制します。
  
 +
== メモリの確保と解放 ==
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
 
int *p = new int(30); // 確保と初期化
 
int *p = new int(30); // 確保と初期化
行31: 行27:
  
 
== 配列の確保と解放 ==
 
== 配列の確保と解放 ==
 
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
 
int *p = new int[10]; // 確保
 
int *p = new int[10]; // 確保
行40: 行35:
  
 
== アロー演算子 ==
 
== アロー演算子 ==
 
+
ポインタでインスタンスをポインタで操作する場合、メンバ変数やメンバ関数のアクセスには、アロー演算子(->)を利用します。
ポインタで
+
インスタンスをポインタで操作する場合、メンバ変数やメンバ関数のアクセスには、アロー演算子(->)を利用します。
+
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
 
#include <iostream>
 
#include <iostream>
行65: 行58:
  
 
== 関連項目 ==
 
== 関連項目 ==
 
 
* [[配列]]
 
* [[配列]]
 
* [[boost::array]]
 
* [[boost::array]]
 
* [[C++言語解説]]
 
* [[C++言語解説]]
 +
* [[C++ライブラリ]]
 +
{{smartpointer}}
 +
<!-- vim: filetype=mediawiki -->

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

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 = Foo(3);
	p->m_i += 20;
	p->show ();
	return 0;
}

関連項目