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

在栈区申请对象数组,
   
 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)之上,而且一旦丢失只能通过重启来恢复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值