うわー、あなたはタイプミスをしているようです。それはvector<Item *> Items;
あなたの質問に関して:
- ベクトル Items のサイズは変更されません。つまり、Item オブジェクトへの 3 つのポインタがまだあります。
- ベクトルの内容は変更されません: Items[1]->suicide() の前、Items[0] = 0x000001、Items[1] = 0x000005、Items[2] = 0x000009、Items[1]->suicide() の後、アイテム[0] = 0x000001、アイテム[1] = 0x000005、アイテム[2] = 0x000009
- そうすることは間違いなくOKです。
その上、ベクトルはそのメモリを自動的に管理します。容量が十分でないときにいくつかの要素をそれにプッシュすると、より大きなスペースが再割り当てされますが、いくつかの要素をポップしたり、いくつかの要素を消去したりすると、冗長メモリは決して与えられませんシステムに。
のコードはItems[1]->sucide()
、ポインター Items[1] が保持またはポイントするメモリをシステムに返すだけで、ポインター自体には何もしません。Items[1] は同じ値を保持しますが、安全でない領域を指します。
予期せず、デザイン パターンを作成しました。クラスをデザインする必要があり、そのクラスのオブジェクトをヒープにのみ割り当てることを許可するとします。次のコードを記述できます。
class MustOnHeap
{
private:
~MustOnHeap() { // ...}
public:
void suicide() { delete this;}
};
次に、デストラクタがプライベートであるため、クラスはスタックに割り当てられたインスタンスを持つことができず、オブジェクトがそのスコープを出るときにコンパイラがデストラクタの呼び出しを調整する必要があります。したがって、それらをヒープに割り当ててから、MustOnHeap* p = new MustOnHeap;
明示的に破棄する必要があります: p->suicide();