对象数组--看慕课网课的笔记

来源:互联网 发布:三国志11全人物数据 编辑:程序博客网 时间:2024/06/05 02:39
在栈区申请对象数组,
   
 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
原创粉丝点击