哇,看来你打错字了。应该是vector<Item *> Items;
关于你的问题:
- 矢量Items的大小没有改变,意味着它仍然有三个指向Item对象的指针。
- 向量的内容没有改变:在 Items[1]->suicide() 之前,Items[0] = 0x000001,Items[1] = 0x000005,Items[2] = 0x000009 在 Items[1]->suicide() 之后,项目[0] = 0x000001,项目[1] = 0x000005,项目[2] = 0x000009
- 这样做绝对没问题。
另外,vector 会自动管理它的内存,当你把一些元素推入其中而容量不够时,它会重新分配一个更大的空间,但是当你弹出一些元素或擦除一些元素时,它永远不会给多余的内存到系统。
代码Items[1]->sucide()
只是将指针Items[1]持有或指向的内存返回给系统,它不会对指针本身做任何事情,Items[1]仍然持有相同的值,但指向一个不安全的区域。
没想到,你已经做了一个设计模式,假设你想设计一个类,并且你只允许在堆上分配它的任何对象,你可以编写以下代码:
class MustOnHeap
{
private:
~MustOnHeap() { // ...}
public:
void suicide() { delete this;}
};
然后,该类不能有任何在堆栈上分配的实例,因为析构函数是私有的,编译器必须在对象走出其范围时安排析构函数的调用。因此,您必须在堆上分配它们,MustOnHeap* p = new MustOnHeap;
然后显式销毁它: p->suicide();