C++基础之detele和detele[]

一、解析这一段简单的代码

class Class              
{
public:
   char a;      
   char *b;                     
  Class::Class()
   {
      a=5;                    (1)
 //  * (&a+1)=5;               (3)
   }
};
int _tmain(int argc, _TCHAR*argv[])

{
    Class *p=new Class[2];   (2)
    detele[]p;
     while(1);
    return 0;
}
二、通过代码画出的结构图

三、解析

  • (2)中 p(0x800)new出一块连续的空间,分成两份(实际就是一块)0x900和0x905:
  • 只有地址名字,没有变量名
  • 每份大小是一样,大小根据类里有多少成员属性来计算(例如这里的0x900和0x905的空间大小同是5字节,因为类里一个指针一个char变量)
  • 每份都有同样的成员变量
  • 在类里给成员变量赋值,会给多个对象的相同成员变量同时赋值((1)里a=5,0x900和0x905都会赋值为5<如图>,


像(3)里找到0x901的地址赋值,会出现0x900是cd,0x905赋值为5,后面空间地址以此类推,如果new Class[4],0x910和0x915仍然被同时赋值5<如图>

,为什么呢,new Class[n]调n次构造)

  • 在main里可以给任意对象赋值且其他对象不会赋值
  • 这样情况下用detele或detele []效果一样,将开辟的这一块连续的空间都释放

以上属于简单情况

四、复杂情况下代码:(5)代码,成员指针初始化

class Class              
{
public:
   char a;      
   char *b;                    (4) 
  Class::Class()
   {
      b=new char;                (5)
   }
};
int _tmain(int argc, _TCHAR*argv[])
{
    Class *p=new Class[2];   (2)
    detele[]p;
     while(1);
    return 0;
}

五、解析复杂代码

  • 1.   这样成员指针b,new出来的空间有可能连续
  • 2.   同样只有地址名没有变量名
  • 3.   New出来的每块空间大小一样,大小根据成new的大小
  • 4.   类里赋值,都会赋同样的值,main里可以单独赋值

 区别在于main里用detele的时候,只会调一次析构函数,这样,0x900 0x905 0x700空间被释放,0x605……内存泄漏,用detele []p,就会调过几次构造就调几次析构,就都会释放

detele和detelp[]区别,detele用于释放new出单个对象的空间

detele[]用于释放new[]出多个对象的空间

六、通过代码画出的结构图

 

练习:

1.将结构图能画出

2.给其中的0x900、0x905、0x700、0x605单独赋值

解2:

发现:(p + n)->a能直接找到0x900划分的第几份的int a,(p + n)->b能直接找到0x900划分的第几份的char *b,相当于给0x700、0x605单独赋值了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值