《C++ primer》——ch5 表达式:new和delete
2015-04-21 22:31
281 查看
delete后指针置0
释放指针后,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个元素。
<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个元素。
相关文章推荐
- C++ Primer 有感(new和delete表达式)
- C++ Primer 有感(new和delete表达式)
- C++ Primer 有感(new和delete表达式)
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
- new/delete /new表达式
- 《C++ Primer》笔记-创建动态数组new,delete
- 第五章 表达式(part3) 复合表达式的求值、new 和 delete 表达式、类型转换
- new 和 delete 表达式(c++primer)
- 【C++】new和delete表达式与内存管理
- new和delete表达式
- new和 delete表达式
- new 和 delete 表达式
- C++基础知识学习:new与delete表达式
- C++ primer 总结(sizeof,delete,new)
- C++ primer中关于new和delete工作的描述
- C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)
- [C++ 学习] C++ Primer 习题 5.30 new & delete 操作符
- c++中优化内存分配:new/delete操作符;allocator类对象的使用;operator new/operator delete函数及定位new表达式
- C++的new和delete表达式
- new和delete表达式