1

かなり単純な質問があります。オブジェクトへのポインタを含む配列があります。私は時々、それらの配列から変更された配列を作成し、それらをメソッド内でのみ使用します。その後、私はそれらを必要としません。この場合、元の配列を使用し続けるため、ポイントされたデータが破棄されることは望ましくありません。私が完全に理解していないのは、一時的な配列で作成されたポインター (データ自体ではなくポインター) に何が起こるかです。メモリはそれらにどのように対処しますか。私の知る限り、ポインターはアドレスのみを指すことができます。それらを「削除」することはできません。

私にもっと洞察を与えることができる人はいますか?この間ずっと、記憶に何か間違ったことをしているような気がします。

この場合、list は配列実装のオブジェクト ラッパーである「バッグ」です。ただし、インデックス間にギャブが含まれているため、getGapless を使用して、nullptr インデックスが除外されたバッグを取得します。

最後にバッグを削除しますが、実際のコンテンツは削除されません (別の方法で行われます)。

では、「プレーヤー」バッグ内のこれらのポインターはいつ範囲外になるのでしょうか?

virtual void processEntities(artemis::ImmutableBag<artemis::Entity*>& bag)
{
    artemis::Bag<artemis::Entity*> * list  = (artemis::Bag<artemis::Entity*>*)this->world->getGroupManager()->getEntities("HUMAN");
    if(list == nullptr) return;//Kill function

    artemis::Bag<artemis::Entity*> * players = list->getGapless();

    for(int i=0; i<players->getCount(); i++)
    {
        for(int j=i+1; j < players->getCount(); j++)
        {
            if(intersects(*players->get(i),*players->get(j))){
                std::cout << "Collide YEAH \n";
            }
        }
    }
    delete players;

}
4

3 に答える 3

5

いいえ、心配しないでください!intポインターは、 s またはsと同じ方法でdouble(少なくともメモリに関して) 管理されると考えることができます。ポインター自体はint、たまたま他のオブジェクトまたはオブジェクトの配列のアドレスを含む のようなものです。ポインターがスコープから消えると、ポインター自体のメモリは自動的に回復されます。

int** p = new int*[1]のようなことをしている場合、つまり でポインタを作成している場合は例外ですnew。その後、ある時点で必要になりdelete pます。

のようなポインターを作成している場合int* p = new int[size];(これはおそらくあなたが望むものです)、それp自体はスタック上にあります。つまり、メモリの割り当て解除について心配する必要はありませんが、配列のpポイントはヒープ上にあります。つまり、ある時点で割り当てを解除する必要があります。

于 2012-07-17T16:45:13.550 に答える
1

ポインターは通常の変数です。それらは特別な方法で処理されません。その点でポインター配列と整数配列の間に違いがないため、その点でポインター変数と整数変数の間に違いはありません。

言語内のすべての変数のメモリ管理は完全にあなた次第です。ローカル変数を宣言すると、制御がブロックの外に出たときに自動的に破棄されます。オブジェクトを動的に割り当て/作成する場合は、明示的に割り当てを解除/破棄する必要があります。等々。ポインターについて特別なことはまったくありません。それらは他の変数と同じです。

基本的に、あなたの質問が対処しているように見える問題は実際には存在しないため、なぜこの質問をしているのかは明らかではありません. この質問をした理由の例を挙げていただけますか?

于 2012-07-17T16:47:46.437 に答える
0

'int'が整数を保持するのと同じように、ポインタはアドレスを保持するだけです。代わりにintの配列があり、それに基づいて変更された配列を使用していて、変更された配列を削除した場合、元の配列は変更されません。ここでも違いはありません。

変更された配列の値はなくなりますが、それらはコピーであるため(intまたはポインターなどに関係なく)、元の値には影響しません。

于 2012-07-17T16:53:29.057 に答える