Cpp New演算子 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(new演算子)
 
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演算子によって確保されたメモリは[[Cpp Delete演算子|delete演算子]]によって解放処理を記述します。new演算子で確保したメモリがあってもdelete演算子によって解放をしない場合は名前空間の終了時に解放されます。
 
new演算子は、ポインタ変数に対して、new演算子の後ろに設定する型でメモリを確保する命令です。配列のメモリ確保も出来ます。このようなメモリの確保は動的なメモリ確保と呼ばれます。int n;のように定義された通常の変数はプログラム中で変数宣言されたところから、名前空間が終了するまでメモリ確保がされます。静的なメモリ確保と呼びます。常に一定の大きさのメモリを消費します。対して、動的なメモリ確保では、プログラム中で任意の区間で繰り返しメモリの確保と解放を繰り返すことができ、メモリ確保のタイミングをプログラム側で制御することが出来ます。配列の大きさもプログラム動作時に任意の大きさで確保できるため、必要最小限のメモリ確保を行うように制御することも可能です。静的なメモリ確保では配列の大きさは予め決められた一定の大きさでしか設定できないため、不必要にメモリを大きく確保することが多くなります。new演算子によって確保されたメモリは[[Cpp Delete演算子|delete演算子]]によって解放処理を記述します。new演算子で確保したメモリがあってもdelete演算子によって解放をしない場合は名前空間の終了時に解放されます。
  
45行: 49行:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
もちろんコンストラクタが準備されていなければ、対応した引数を付与しない限りnew演算子による動的な変数の生成処理は失敗します。具体的には個々のクラスや型名の生成方法・コンストラクタに関する仕様書や説明書を参照して下さい。
 
もちろんコンストラクタが準備されていなければ、対応した引数を付与しない限り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++]]に戻る

2021年2月6日 (土) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス