0

簡単な質問があります。次のようなコードがある場合:

void Holder::Add()
{
    Dish * obj = new Dish(this->screen_width, this->screen_height);
    this->dish_array.push_back(obj);
}

ここで、dish_array は次のように宣言されています。

vector <Dish*> dish_array;

「* obj」ポインタが指しているオブジェクトは、この関数の外に「存在」しますか?

4

7 に答える 7

1

はい、きっとそうなるでしょう。ただし、「存在」を定義する方法は 2 つあります。

1) 関数外で参照/使用できますか? この場合、作成したオブジェクトへの参照を格納する変数にobj値が入れられたため、可能です。dish_array

2) オブジェクトはまだメモリ内にありますか? この場合も、はい。オブジェクトを解放することはありません。ただし、行がない場合this->dish_array.push_back(obj)、オブジェクトはメモリ内に残りますが、参照することはできません。これはメモリ リークになります。

于 2013-07-03T22:22:11.603 に答える
0

はい。これは がフリー ストアに割り当てる副作用でnewあるため、手動でクリーンアップを適用する必要があります。

于 2013-07-03T22:20:48.753 に答える
0

はい。newキーワードを使用して、返されたDish後でも新しいインスタンスを (ガベージではなく) 維持することを具体的に要求していHolder::Addます。でメモリを解放するまで、ヒープに残りますdelete。そうしないと、メモリリークが発生する可能性があるため、ある時点でそれを行うことを忘れないでください!

于 2013-07-03T22:21:56.257 に答える
0

はい - new の呼び出しは、割り当てられたメモリへのポインタを返します。このポインタのコピーを に保存していますvector。割り当てられたメモリは、ポインターで削除をアクティブに呼び出すまで保持されます。コード内のメモリ リークを回避するには、ベクター内のポインターを反復処理し、ベクターが範囲外になる前に (どこにいても) 削除を呼び出す必要があります。もちろん、他の時点でそれらを消去し、その時点で削除を呼び出す場合を除きます。ベクターが破棄されると、ベクター内のすべてのアイテムも破棄されます。この場合、ポインターしかないため、ポインターが破棄されても、そのポインターで delete を呼び出すまで、ポインターが指すメモリは解放されません。

于 2013-07-03T22:22:25.683 に答える