- delete后指针置0
<span style="font-size:12px;">int i;
int *p = &i;
delete p;
p = 0; //p = NULL;</span>
释放指针后,p变成了未定义,但p仍然存放之前所指向对象的地址,p所指向的内存已释放,因此p不再有效。
这种情况下,p变成悬垂指针,它往往会引发程序错误,且难发现。最后一句话则保证了安全性,使得p释放后不再指向任何对象,这句话必须存在。
2. 与动态内存分配相关的三种常见错误
- 删除(delete)指向动态分配内存的指针失败,即内存泄漏,因而无法将该块内存还给自由存储区;
- 读写已删除的对象,该问题可以通过上述指针置0来检测;
- 对同一个内存空间delete两次:两个指针指向同一个动态创建的对象,其中一个做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时自由存储区可能会被破坏。
3.
vector<string> *pvec1=new vector<string>(10) 分配一个vector容器,里面有10个string元素;
vector<string> *pvec2=new vector<string>[10] 分配一个数组,数组含有vector<string>类型10个元素。
vector<string> *pvec2=new vector<string>[10] 分配一个数组,数组含有vector<string>类型10个元素。