1.Q:对一个指针为什么不能连续使用delete运算符?delete一次释放“指针变量”所指向的内存,此时它是不是变成一个空指针?而delete适用于空指针!这就说明delete可以继续释放,这样理解错在哪里?
A:这里有两个概念你要区分清楚,变量的指针和变量本身。指针变量其实是另一个变量,只不过它保存了当前变量的地址。当前变量的存在与否,并不会对指针变量造成任何影响。比如代码:
int * f = NULL; //f == NULL
f = new int; //f == f0 (0x.......)
delete f; //f == f0
最后一步delete之后,f对应的int变量会被撤销,但是这个操作并不会修改 f 的值,它不会变成NULL,而是原先它指向的int变量的地址(尽管它现在已经不存在了)。此时如果再写一个delete f;语句,它又会对刚撤销的变量的地址再作一次变量撤销操作,于是就会出问题了
另外,删除空指针是安全的(因为它什么也没做)。所以,在写构造函数,赋值操作符,或其他成员函数时,类的每个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就可以只用简单地delete掉他们,而不用担心他们是否被new过。
当然事无绝对。例如,你当然不会用delete去删除一个没有用new来初始化的指针,而且,就像用智能指针对象时不用劳你去删除一样,你也永远不会去删除一个传递给你的指针。换句话说,除非成员最初用了new,否则是不用在析构函数里用delete的。