对象数组--看慕课网课的笔记
来源:互联网 发布:三国志11全人物数据 编辑:程序博客网 时间:2024/06/05 02:39
在栈区申请对象数组,
在栈区申请对象数组和普通数组操作没什么区别不做过多叙述
在堆区申请对象数组,
如:
则 : p->i ;与p[0].i所表示的区域相同
可以发现,运行出现啦错误,如图片,这是为什么呢?因为程序中有这样一条语句:"++p",这样p指向的对象就发生啦改变,于是无论是接下来的p[2].i_age/p[2].s_name,还是循环遍历都发生啦越界,于是就发生啦编译没错误,但是运行出错的情况,因此我认为在实际编程的过程中尽量使用一种表达方式,否则会导致指针指向不明,遍历起来也不方便,下面是修改过的代码:
运行结果如图片:
那么问题来啦,内存泄漏有什么危害呢?下面是维基百科上的解释:
在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费
后果
内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
在以下情况,内存泄漏导致较严重的后果:
程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
泄漏在操作系统内部发生;
泄漏在系统关键驱动中发生;
内存非常有限,比如在嵌入式系统或便携设备中;
当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。
class student {public: int i;};student stu[3];//stu[j].i;//j可取1,2,3
在栈区申请对象数组和普通数组操作没什么区别不做过多叙述
在堆区申请对象数组,
如:
class student{public: int i;}; student *p = new student(3);//p是一个指针
则 : p->i ;与p[0].i所表示的区域相同
(p+1)->i与p[1].i所表示的区域相同,下面有一个来自我从网易公开课截的图:
#include<iostream>using namespace std;class student{public: int i_age; string s_name;};int main(){ //定义一个个数组对象,里面有三个成员 student * p = new student[3]; p->i_age = 9; p->s_name = "zz"; (++p)->i_age = 10; p->s_name = "zz1"; p[2].i_age = 11; p[2].s_name = "zz2"; //遍历这个数组,看是否赋值成功 for(int i = 0; i < 3 ; i++) { cout << p[i].i_age << " " ; cout << p[i].s_name << endl; } return 0;}
可以发现,运行出现啦错误,如图片,这是为什么呢?因为程序中有这样一条语句:"++p",这样p指向的对象就发生啦改变,于是无论是接下来的p[2].i_age/p[2].s_name,还是循环遍历都发生啦越界,于是就发生啦编译没错误,但是运行出错的情况,因此我认为在实际编程的过程中尽量使用一种表达方式,否则会导致指针指向不明,遍历起来也不方便,下面是修改过的代码:
#include<iostream>using namespace std;class student{public: int i_age; string s_name;};int main(){ //定义一个个数组对象,里面有三个成员 student * p = new student[3]; p->i_age = 9; p->s_name = "zz"; (++p)->i_age = 10; p->s_name = "zz1"; (++p)->i_age = 11; p->s_name = "zz2"; //遍历这个数组,看是否赋值成功 for(int i = 0; i < 3 ; i++) {//输出为倒序 cout << p->i_age << " " ; cout << p->s_name << endl; p--; } return 0;}//同样可以使用类似数组的形式来便利,而且我认为在实际编程中使用数组的形式更加清晰便利,不用担心指针指向哪里,下面是数组形式(索引形式)的便利#include<iostream>using namespace std;class student{public: int i_age; string s_name;};int main(){ //定义一个个数组对象,里面有三个成员 student * p = new student[3]; p[0].i_age = 9; p[0].s_name = "zz"; p[1].i_age = 10; p[1].s_name = "zz1"; p[2].i_age = 11; p[2].s_name = "zz2"; //遍历这个数组,看是否赋值成功 for(int i = 0; i < 3 ; i++) { cout << p[i].i_age << " " ; cout << p[i].s_name << endl; } delete [] p;/*不要忘记释放内存,并且需要指向原来的地址,且不要忘记加 "[]"这样才能按申请的数量释放内存,若没有加[],则只销毁p指向的内存。销毁内存时调用析构函数*/ p = NULL; return 0;}
运行结果如图片:
那么问题来啦,内存泄漏有什么危害呢?下面是维基百科上的解释:
在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费
后果
内存泄漏会因为减少可用内存的数量从而降低计算机的性能。最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
内存泄漏可能不严重,甚至能够被常规的手段检测出来。在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放。这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果。
在以下情况,内存泄漏导致较严重的后果:
程序运行后置之不理,并且随着时间的流失消耗越来越多的内存(比如服务器上的后台任务,尤其是嵌入式系统中的后台任务,这些任务可能被运行后很多年内都置之不理);
新的内存被频繁地分配,比如当显示电脑游戏或动画视频画面时;
程序能够请求未被释放的内存(比如共享内存),甚至是在程序终止的时候;
泄漏在操作系统内部发生;
泄漏在系统关键驱动中发生;
内存非常有限,比如在嵌入式系统或便携设备中;
当运行于一个终止时内存并不自动释放的操作系统(比如AmigaOS)之上,而且一旦丢失只能通过重启来恢复。
0 0
- 对象数组--看慕课网课的笔记
- java学习笔记-数组,对象的拷贝
- javascript学习笔记--数组对象的操作
- C++学习笔记(三)——对象数组的指针和对象指针的数组
- MongoDB学习笔记~官方驱动嵌套数组对象的更新
- Java学习笔记(一)对象数组的初始化
- C++学习笔记 数组对象
- 学习笔记:javascript内置对象:数组对象
- 非数组对象借用数组方法/《设计模式与开发实践》p52例子的扩展笔记
- 学习笔记之JS 对象数组Array根据对象object key的值排序sort
- c++学习笔记 动态内存分配 对象、对象数组的动态创建和释放
- 9、字符串、数组、对象等内置对象的拓展—ES6学习笔记
- 对象数组的初始化
- 对象数组的使用
- JavaScript的数组对象
- C#的对象数组
- 对象数组的使用
- 存储对象的数组
- mfc创建窗口居中显示
- SQL进阶练习题
- sublime Text3 序列号
- 苹果发通谍拒绝“热更新”,中国程序猿“最受伤”
- 【图解算法】Java GC算法
- 对象数组--看慕课网课的笔记
- 枚举类型
- 关于Python中dic的一点尝试
- Linux 安装 nginx
- 逻辑与(&&) 和 自增(i++)
- PHP 服务器使用正则表达式不能正常运行!
- linux修改hostname
- UVa
- Android Uri to Path