新しい演算子 (C++)
オブジェクトのメモリまたは " フリー ストアの 型名 のオブジェクトの配列を割り当てオブジェクトに適切に型指定されたゼロ以外のポインターを返します。
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
解説
それ以外の場合は 新規作成 は値を返すか例外をスローします ; 詳細については新しいおよび削除の操作 を参照してください。カスタム例外処理ルーチンを作成し引数として関数名で _set_new_handler ランタイム ライブラリの関数を呼び出すことによって既定の動作を変更できます。
マネージ ヒープにオブジェクトを作成する方法の詳細については " を参照してください。
C.C++ クラス オブジェクトのメモリを割り当てるために 新規作成 を使用するとオブジェクトのコンストラクターはメモリが割り当てられた後に呼び出されます。
新規作成 の演算子で割り当てられたメモリを解放するために 削除 の演算子を使用します。
次の例では10. でサイズ dim の次元配列を割り当てた後解放します。多次元配列を割り当てた場合は1 番目を除くすべての次元が正の値になる定数式である必要があります ; 左端の配列の次元が正の値に評価される式を指定できます。配列を 新規作成 の演算子を使用して割り当てると最初の次元は 新規作成 の演算子の戻り一意のポインターです。
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
型名は 定数 volatileクラス宣言または列挙型の宣言を含めることはできません。したがって次の式は無効です :
volatile char *vch = new volatile char[20];
新規作成 の演算子はオブジェクトではないため参照型はできません。
新規作成 の演算子が関数を割り当てるために使用できない関数へのポインターを割り当てるために使用できます。次の例では整数を返します。関数に 7 個のポインターの配列を割り当て次になります。
int (**p) () = new (int (*[7]) ());
delete *p;
余分な引数なしで演算子を使用し 新規作成 /GX/EHaまたは /EHs オプションを使用してコンパイルするとコンパイラはコンストラクターが例外をスローする演算子を呼び出すように 削除 コードを生成します。
次の一覧は 新規作成 の文法 : 要素について説明します。
位置
新規作成 をオーバーロードする場合は追加の引数を渡す方法を示します。型名
割り当てられる型を指定します ; これは組み込みまたはユーザー定義型を指定できます。型指定が複雑な場合バインディングの順序を強制するためにかっこで囲むことができます。初期化子
初期化されたオブジェクトの値を指定します。は配列初期化子に指定することはできません。 新規作成 の演算子はクラスの既定のコンストラクターがある場合にのみオブジェクトの配列を作成します。
使用例
次のコード例はクラス CName の文字配列とオブジェクトを割り当て次にそれらを解放します。
// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>
class CName {
public:
enum {
sizeOfBuffer = 256
};
char m_szFirst[sizeOfBuffer];
char m_szLast[sizeOfBuffer];
public:
void SetName(char* pszFirst, char* pszLast) {
strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
strcpy_s(m_szLast, sizeOfBuffer, pszLast);
}
};
int main() {
// Allocate memory for the array
char* pCharArray = new char[CName::sizeOfBuffer];
strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");
// Deallocate memory for the array
delete [] pCharArray;
pCharArray = NULL;
// Allocate memory for the object
CName* pName = new CName;
pName->SetName("Firstname", "Lastname");
// Deallocate memory for the object
delete pName;
pName = NULL;
}
新規作成 の演算子の配置に新しいフォームを使用すると割り当てのサイズに適用する引数を持つフォームはコンパイラ コンストラクターが例外をスローした場合 削除 の配置の演算子の形式をサポートしません。次に例を示します。
// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
A(int) { throw "Fail!"; }
};
void F(void) {
try {
// heap memory pointed to by pa1 will be deallocated
// by calling ::operator delete(void*).
A* pa1 = new A(10);
} catch (...) {
}
try {
// This will call ::operator new(size_t, char*, int).
// When A::A(int) does a throw, we should call
// ::operator delete(void*, char*, int) to deallocate
// the memory pointed to by pa2. Since
// ::operator delete(void*, char*, int) has not been implemented,
// memory will be leaked when the deallocation cannot occur.
A* pa2 = new(__FILE__, __LINE__) A(20);
} catch (...) {
}
}
int main() {
A a;
}