0629动态内存分配相关

来源:互联网 发布:mac文件夹不能拖动 编辑:程序博客网 时间:2024/06/11 20:31

new表达式相关

     new 表达式的操作序列如下从空闲存储区分配对象然后用括号内的值初始化该对象
为从空闲存储区分配对象new 表达式调用库操作符new() 前面的new 表达式与下列代码
序列大体上等价:
int ival = 0; // 创建一个用 0 初始化的int 对象
int *pi = &ival; // 现在指针指向这个对象
当然不同的是pi 指向的对象是由库操作符new()分配的位于程序的自由存储区中
类似地如下语句.
iStack *ps = new iStack( 512 );
创建了一个内含512 个元素的iStack 型的对象在类对象的情况下括号中的值被传递
给该类相关的构造函数它在该对象被成功分配之后才被调用。


空悬指针

 在这里讨论pi 的生命期和pi 指向的对象的生命期之间的区别是很重要的指针pi 本
身是个在全局域中声明的全局对象结果pi 的存储区在程序开始之前就被分配且一直保
持到程序结束这与pi 指向的对象的生命期不同后者是在程序执行过程中遇到new 表达式
时才被创建的pi 指向的内存是动态分配的它拥有的对象是动态分配的对象因此pi 是
一个全局指针指向一个动态分配的int 型对象当程序运行期间遇到delete 表达式时pi
指向的内存就被释放了但是指针pi 的内存及其内容并没有受delete 表达式的影响在delete
表达式之后pi 被称作空悬指针即指向无效内存的指针空悬指针是程序错误的一个根源
它很难被检测到一个比较好的办法是在指针指向的对象被释放后将该指针设置为0 这
样可以清楚地表明该指针不再指向任何对象


下面三个常见程序错误都与动态内存分配有关

 1 应用delete 表达式失败使内存无法返回空闲存储区这被称作内存泄漏memoryleak。
 2 对同一内存区应用了两次delete 表达式这通常发生在两个指针指向同一个动态分配
 对象的时候这是一个很难踉踪的问题若多个指针指向同一个对象当通过某一个指针释
 放了该对象时就会发生这样的情况此时该对象的内存被返回给空闲存储区然后又被分
 配给某个别的对象接着指向旧对象的第二个指针被释放新对象也就跟着消失了。
 3 在对象被释放后读写该对象这常常会发生因为delete 表达式应用的指针没有被设
 置为0。

原创粉丝点击