New演算子

newまたはNewは、C++を始めとしたオブジェクト指向プログラミング言語において、インスタンスを作成する演算子である。多くの場合、ヒープ領域からの動的メモリ確保（動的記憶域確保）を伴う。
new演算子によるインスタンスの作成は、大きく分けて、記憶域を確保することと初期化を行うことに分けられる。記憶域を確保する処理は、多くの場合言語の処理系が用意するが、後述するC++のようにプログラム内で独自に定義できるものもある。初期化は、コンストラクタを呼ぶことで行われ、プログラム内で自由に定義できることが一般的である。

エラー処理

C++の場合、new演算子で記憶域確保に失敗すると、多くの場合、例外が投げられる。そのため、C言語関数のmallocなどと違い、newの結果は常に正当なオブジェクトを指し示しているものとして扱うことが可能である。ただし、古いコンパイラでは確保失敗時にNULLを返すものがあるので注意が必要である。また、組み込み用途など、コンパイラの設定で例外の使用を不可能にした場合も、確保に失敗したときはNULLが返却される。
C#およびJavaの場合、new演算子がnullを返すことはなく、必ず例外がスローされる。

C++

C++のnew演算子とnew[]演算子は、まず、同名の演算子関数（後述）で記憶域を確保し、次にコンストラクタを呼んでインスタンスの初期化を行う。C++のnew演算子という名称は、Simulaの同名の演算子に由来する。

deleteとdelete[]演算子

C++では、newあるいはnew[]で記憶域を動的に確保して生成したインスタンスは、不要になったときにそれぞれdeleteあるいはdelete[]演算子で破棄されなければならない。これはC言語においてmalloc関数で確保した領域をfree関数で解放することに相当するが、deleteあるいはdelete[]演算子の場合はメモリ解放の前にデストラクタが呼ばれる点が異なる。ヒープ領域に動的に確保されたメモリは自動的に破棄されることはなく、破棄し忘れたままプログラムを続行するとメモリリークとなる。多くの場合、明示的な破棄を毎回記述することはプログラマの負担となるため、破棄をデストラクタに任せるRAIIパターンが利用される。デストラクタを利用することで例外が発生しても確実に破棄することが可能となる（例外安全）。
従来のC++標準ライブラリにはスマートポインタのクラステンプレートとしてstd::auto_ptrが定義されていたが、C++11では廃止予定となり、代わってstd::unique_ptrやstd::shared_ptrなどが定義された。
#include <memory>class Bar { /* ... */ };void f(){
    auto b = std::make_unique<Bar>();
    // make_unique<Bar>は、newとunique_ptrに関する補助的な関数テンプレートである。new Barを行い、結果のポインタをunique_ptr<Bar>に格納して返す。
    // すなわち、上記はstd::unique_ptr<Bar> b(new Bar);に相当する。

    //...} // 有効範囲（スコープ）から外れるこの位置でbのデストラクタが実行される。unique_ptr<Bar>のデストラクタが、内包するBarオブジェクトのdeleteを行う。
動的配列のRAIIとしては、std::vectorクラステンプレートがよく利用される。

配置new

配置new (プレースメントnew, placement new) は、new演算子からnew演算子関数へ引数を与えられる機能である。当初、インスタンスを特定のメモリアドレスに「配置」するための機能ということで配置newと命名された。後に配置に限らず様々な使い道に応用できることが明らかとなったものの、今でも慣習的に配置newと呼ばれる。
例えばヘッダ<new>には、通常のnew、new[]演算子関数のほか、次のようなnew、new[]演算子関数が定義されている (X3014 18.4)。
void* operator new(std::size_t, void*) throw();void* operator new[](std::size_t, void*) throw();void* operator new(std::size_t, std::nothrow_t) throw();void* operator new[](std::size_t, std::nothrow_t) throw();
上の2つは引数に与えられたポインタをそのままnew演算子関数の戻り値とするもので、当初の配置newの目論見どおり指定したメモリアドレスにオブジェクトを配置するために使用できる。
class Hoge {/* ... */};void *p = std::malloc(sizeof (Hoge)); // new演算子を使わず、mallocでメモリ領域を確保するHoge *obj = new(p) Hoge;//objを使うobj->~Hoge();std::free(p);
下の2つは記憶域が確保できなかったときに、例外を投げない代わりにヌルポインタを返すnewである（なお、newハンドラは呼ばれる）。std::nothrow_t型のインスタンスとしてstd::nothrowが定義されており、次のように使用する。
int* p = new(std::nothrow) int;delete p;
deleteおよびdelete[]演算子は、std::nothrow_tを引数に取るnewが返す記憶域も解放できると定められている。また、std::nothrow_tを引数に取るものも、そうでない（nothrow_tを引数に取らない配置newでないnew演算子関数）もの同様にプログラム内で定義可能とされている (X3014 18.4.1.1 6)。
newおよびnew[]演算子を使用した際、コンストラクタが例外を投げると、コンパイラは引数の対応するdeleteないしdelete[]演算子関数で記憶域を解放しようとする。そのため、newおよびnew[]演算子で独自の記憶域確保を行う場合、対応するdelete、delete[]演算子を用意すべきであるとされる。
class MyAllocator;class Foo{
    static void* operator new(std::size_t, MyAllocator);
    static void* operator new[](std::size_t, MyAllocator);
    static void operator delete(void*, MyAllocator);
    static void operator delete[](void*, MyAllocator);};

エラー処理

newやnew[]が記憶域を確保できなかった場合、既定では例外クラス型std::bad_alloc（またはその派生クラス）のインスタンスが投げられるが、カスタマイズすることも可能である。

newハンドラ

newハンドラは、既定のnewおよびnew[]演算子関数で記憶域確保に失敗した場合に呼ばれるコールバック関数であり、std::set_new_handler関数で登録できる。当時まだ例外処理がなかったC++で、記憶域確保の失敗をまとめて取り扱うために導入された。
newハンドラでは、例外を投げたり、プログラムを終了させたりするなどのほか、何らかの方法で記憶域に空きを作ることで、newおよびnew[]演算子関数の記憶域確保を成功へ導かせることも可能である。

C++/CLI

C++/CLIでは、C++のnew演算子のほかに、マネージヒープから記憶域を確保するgcnew演算子が存在する。
System::Object^ o = gcnew System::Object;
gcnewには、配置構文は存在しない。
また、gcnewにはnew[]演算子に相当する配列構文も存在しない。CLI配列（マネージ配列）の作成には、arrayキーワード (cli::array型) を用いる。
array<int>^ a1 = gcnew array<int>(10); //要素数10の1次元配列array<int, 2>^ a2 = gcnew array<int, 2>(3, 4); //3×4の2次元配列
ただし、gcnewには配列初期化の構文が存在する。
array<int>^ a1 = gcnew array<int>(4) {0, 1, 2, 3};array<int>^ a2 = gcnew array<int> {0, 1, 2, 3}; //上と同じ。初期化子から要素数が算出される。array<int, 2>^ a3 = gcnew array<int, 2> {{0, 1}, {2, 3}}; //多次元配列の例

C#

C#のnew演算子は、インスタンスを生成・初期化するという意味を持っており、参照型を対象とする場合はヒープから記憶域を確保するが、値型（構造体や列挙型）を対象とする場合は単に一時的なインスタンス（これはヒープ上に生成されるのではない）を初期化するだけである。
下のコードの場合、少なくとも概念上は、一時的なint型のインスタンスが生成され、それがxへコピーされているという扱いである。
// intは値型なので、xはスタック上に存在する。int x = new int();
上記は以下と等価である。
int x = 0;

Java

Javaのnew演算子もC#と同じくオブジェクトの生成と初期化に利用される。ただしC#と違ってプリミティブ型の初期化にnew演算子は使えない。
class Point { int x, y; }Point pt = new Point();//int x = new int(); // コンパイル不可。

Visual Basic

Visual Basicには、キーワードNewが存在し、COMのクラスのインスタンス作成に用いる。
'MSXML2が参照設定されてあるものとする。Dim xd As MSXML2.DOMDocumentSet xd = New MSXML2.DOMDocument
また、次のように変数の宣言と同時にインスタンスを作成し変数を初期化させることも可能である。
Dim xd As New MSXML2.DOMDocument
ただし、この2つのコード例は必ずしも同じ意味を持つとは限らない。

Visual Basic .NET

Visual Basic .NETのNewは、概ねVisual Basicの構文を踏襲している。しかし、CLIクラスを対象にする点が異なる。
Dim o1 As System.Objecto1 = New System.Object()Dim o2 As New System.Object()
また、配列の初期化も可能となった。
Dim a As Integer()a = New Integer() {0, 1, 2}

他の手法

オブジェクト指向の言語では、何かしらの方法によりオブジェクトを生成できるようにする必要があるが、その手段が演算子である必然性はない。例えば、C++では、参照やポインタとしてでなく宣言されたオブジェクト型の変数は、暗黙のうちにオブジェクトを生成し、自動的に初期化される。また、Objective-CやRubyのように、オブジェクトの生成をクラスメソッドにより行う言語もあるほか、オブジェクトの生成をファクトリメソッドに落としこんで、継承により上書き可能な形とすることも行われる。