Cpp New演算子 新しいページはコチラ
提供: yonewiki
(ページの作成:「<table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-tex...」) |
|||
1行: | 1行: | ||
+ | [[C PlusPlus#C++からの技術|C++]]に戻る | ||
+ | |||
+ | |||
<table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> | <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> | ||
<tr> | <tr> | ||
<td style="width:1px;"></td> | <td style="width:1px;"></td> | ||
− | <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ New演算子</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> | + | <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++(Cpp) New演算子</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> |
</tr> | </tr> | ||
</table> | </table> | ||
8行: | 11行: | ||
<br /> | <br /> | ||
== '''new演算子''' == | == '''new演算子''' == | ||
− | new演算子は、ポインタ変数に対して、new演算子の後ろに設定する型でメモリを確保する命令です。配列のメモリ確保も出来ます。このようなメモリの確保は動的なメモリ確保と呼ばれます。int n; | + | |
+ | new演算子は、ポインタ変数に対して、new演算子の後ろに設定する型でメモリを確保する命令です。配列のメモリ確保も出来ます。このようなメモリの確保は動的なメモリ確保と呼ばれます。int n;のように定義された通常の変数はプログラム中で変数宣言されたところから、名前空間が終了するまでメモリ確保がされます。静的なメモリ確保と呼びます。常に一定の大きさのメモリを消費します。対して、動的なメモリ確保では、プログラム中で任意の区間で繰り返しメモリの確保と解放を繰り返すことができ、メモリ確保のタイミングをプログラム側で制御することが出来ます。配列の大きさもプログラム動作時に任意の大きさで確保できるため、必要最小限のメモリ確保を行うように制御することも可能です。静的なメモリ確保では配列の大きさは予め決められた一定の大きさでしか設定できないため、不必要にメモリを大きく確保することが多くなります。new演算子によって確保されたメモリは[[Cpp Delete演算子|delete演算子]]によって解放処理を記述します。new演算子で確保したメモリがあってもdelete演算子によって解放をしない場合は名前空間の終了時に解放されます。 | ||
例1 | 例1 | ||
30行: | 34行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
配列の確保は上記のように行います。動的なメモリ確保では、配列の大きさに変数を設定することができます。静的なメモリ確保を行う配列では、コンパイルエラーとなるような指定が可能です。 | 配列の確保は上記のように行います。動的なメモリ確保では、配列の大きさに変数を設定することができます。静的なメモリ確保を行う配列では、コンパイルエラーとなるような指定が可能です。 | ||
+ | |||
+ | new演算子の後ろの型名に引数をつけるパターンもあり、この場合はコンストラクタが準備されていれば、引数に対応したコンストラクタが動作して初期化がなされます。引数を省略している場合はデフォルトコンストラクタが動作していると考えてよいでしょう。new演算子の後ろにはクラス名を記述することもできます。動的にクラス変数を生成することもできます。intの場合は引数に一つの整数値を付与することができます。したがって以下のようにnew演算子を使うことができます。 | ||
+ | |||
+ | 例4 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | int *pnReturnValue = new int(100); | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 引数無しは以下のようにも記述できます。 | ||
+ | |||
+ | 例5 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | int *pnReturnValue = new int(); | ||
+ | </syntaxhighlight> | ||
+ | もちろんコンストラクタが準備されていなければ、対応した引数を付与しない限りnew演算子による動的な変数の生成処理は失敗します。具体的には個々のクラスや型名の生成方法・コンストラクタに関する仕様書や説明書を参照して下さい。 | ||
+ | |||
+ | |||
+ | new演算子は、演算子ですから、演算子のオーバロードをすることができます。以下のような関数に独自の機能を追加していけばよいです。但し、オーバロードした関数内ではC++の関数を使うとC++関数の中でnewが再び呼び出される可能性があるため、C++関数を使わないような工夫が必要です。C++関数を利用すると無限スタックが発生し、new演算子の呼び出しでプログラムが暴走します。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | void* operator new(size_t sizeNew) { | ||
+ | return malloc(sizeNew); | ||
+ | } | ||
+ | void operator delete(void* pDelete) { | ||
+ | free(pDelete); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | [[C PlusPlus#C++からの技術|C++]]に戻る |