「newとdelete」の版間の差分
提供: C++入門
細 |
|||
行1: | 行1: | ||
− | |||
− | |||
− | |||
− | |||
[[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; }