2009-03-24 21 views
86

可能性の重複:
When should I use the new keyword in C++?C++では "new"を使用する場合と使用しない場合はどちらを使用しますか?

私はC++で "新しい" 演算子を使用する必要がありますか?私はC#/ Javaの背景から来て、インスタンス化するオブジェクトは私のために混乱しています。

私はポイントを作成するとき、私は私べきで、「ポイント」と呼ばれる単純なクラスを作成した場合:新しいを使用する際

Point p1 = Point(0,0); 

または

Point* p1 = new Point(0, 0); 

誰かが私のために明確にすることができ演算子としない場合は?

When should I use the new keyword in C++?

関連:の

重複

About constructors/destructors and new/delete operators in C++ for custom objects

Proper stack and heap usage in C++?

+0

重複 - ニールが言ったように –

+0

と数えて何度も何度も尋ねられています。 – Naveen

答えて

110

あなたはnewを使用する必要がありますあなたはオブジェクトが存在するまであなたがdeleteまでそれを望むとき。 newを使用しないと、オブジェクトはスコープから外れると破棄されます。これのいくつかの例は以下のとおりです。

void foo() 
{ 
    Point p = Point(0,0); 
} // p is now destroyed. 

for (...) 
{ 
    Point p = Point(0,0); 
} // p is destroyed after each loop 

一部の人々はnewの使用は、あなたのオブジェクトはヒープまたはスタック上にあるが、それは関数内で宣言した変数の唯一の真実であるかどうかを決定することを言うだろう。

以下の例では、 'p'の位置は、そのオブジェクトFooが格納されている場所になります。私はこれを「インプレース」割り当てと呼んでいます。

class Foo 
{ 

    Point p; 
}; // p will be automatically destroyed when foo is. 

割り当て(および解放)はnewを使用してオブジェクトをはるかに高価なその使用が必要な場合に限定されなければならないので、彼らはその場で割り当てられている場合よりもです。

newで割り振るときの2番目の例は、配列の場合です。実行時にインプレースまたはスタック配列のサイズを変更することはできません。したがって、未定義サイズの配列が必要な場合は、newを介して割り当てる必要があります。

など。

void foo(int size) 
{ 
    Point* pointArray = new Point[size]; 
    ... 
    delete [] pointArray; 
} 

(*先行ニックピッキング - はい、可変サイズのスタック割り当てを可能にする拡張子があります)。

+2

+1新しいポインタを手動で削除する必要があることを覚えておいてください。 delete p1; –

+6

+1いいね。最初のものはPoint p(0、0)と書くことができます。あまりにも。 =構文は、pがどういうわけか何かに割り当てられたポインタだと考えるようにするかもしれません。 –

+0

@Andrew Grant新しい使用法 'shared_ptr'または' unique_prt'を使用する必要がある場合。 C++で導入された11 STL 共有ポインタは自動的に削除の本を保持します。 shared_ptr'コール削除 'によって提供されるアレイのデフォルト・デリータため ノート、削除しない[]従って 'のstd :: shared_ptrの P(INT [10]、 は[](int型*のP){ [新しい削除ラムダ関数を使用] P; }); ' または'のstd :: shared_ptrの P(新しいINT [10]、 のstd :: default_delete ()); ' または削除呼び出しunique_ptrをから提供されたヘルパーを使用して[ ] 'std :: unique_ptr p(new int [10]、 [](int * p){ delete [] p; }); ' – katta

9

C++オブジェクトのインスタンス化に関するいくつかの良い答えについてはthis questionthis questionを見てください。

ヒープ上でインスタンス化されたオブジェクト(newを使用)は手動でクリーンアップする必要があり、スタック上でインスタンス化されたオブジェクト(新規なし)はスコープ外になると自動的にクリーンアップされます。

void SomeFunc() 
{ 
    Point p1 = Point(0,0); 
} // p1 is automatically freed 

void SomeFunc2() 
{ 
    Point *p1 = new Point(0,0); 
    delete p1; // p1 is leaked unless it gets deleted 
} 
1

新しいものは常に動的メモリを割り当てるために使用されます。これは解放する必要があります。

最初のオプションを実行すると、スコープが失われたときにメモリが自動的に解放されます。

Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function. 

Point* p2 = new Point(0, 0); //This must be freed manually. with... 
delete p2; 
4

スタックの代わりにヒープ上にオブジェクトを作成する場合は、newを使用する必要があります。これにより、ポインターを使用して、現在の関数またはプロシージャーの外部からオブジェクトにアクセスすることができます。

C++でポインターやメモリ管理を調べることは、他の言語では見逃せないことがあるため、役に立つかもしれません。

+0

新しいものはヒープ割り当てを保証するものではなく、単純に新しい回避はスタック割り当てを保証しません。 –

関連する問題