1. ホーム
  2. c++

[解決済み] C++で "new "を使うべきとき、使ってはいけないとき?重複

2022-08-10 03:47:58

質問

重複の可能性があります。

C++でnewキーワードはいつ使うべきですか?

C++で"new"演算子はいつ使うべきですか?私はC#/Javaのバックグラウンドを持っており、オブジェクトのインスタンス化は私にとって混乱を招くものです。

もし私が"Point"というシンプルなクラスを作成した場合、点を作成するときに私はすべきでしょうか。

Point p1 = Point(0,0);

または

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

新しい演算子をいつ使って、いつ使ってはいけないのか、どなたか明確にしていただけませんか?

の重複です。

C++でnewキーワードはいつ使うべきですか?

関連する

C++ におけるカスタムオブジェクトのコンストラクタ/デストラクタと new/delete 演算子について

C++における適切なスタックとヒープの使用法?

どのように解決するのですか?

この場合 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 で割り当てる場合の二番目の例は、配列の場合です。インプレース配列やスタック配列は、実行時にサイズを変更することはできません*。

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

(*pre-emptive nitpicking - yes, there are extensions that allow variable sized stack allocations).