C++基础之detele和detele[]
来源:互联网 发布:选股软件哪个好 编辑:程序博客网 时间:2024/06/05 15:37
一、解析这一段简单的代码:
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
- C++基础之detele和detele[]
- free、detele与野指针
- Medoo Detele的使用:删除数据
- TRANCATE TABLE与DETELE TABLE的区别
- Windows 上C++ new/detele如何知道内存大小
- 前端学习-jquery-实现点击button对文本的add及detele
- Objective-C基础之self和super
- iOS之Object-c编程基础之NSString和NSMutableString
- iOS之Object-C基础编程之NSArray和NSMutableArray
- C++基础重温之二:C和C++中的static
- IOS学习之二:Objective-C基础语法和关键字
- c语言基础之探讨i++和++i
- C语言基础之宏定义##连接符和#符
- IOS学习之二:Objective-C基础语法和关键字
- c++primer之函数(函数基础和参数传递)
- 基础C语言之Typedef和struct的结合使用
- C语言基础之结构体和共用体
- C语言基础编程之统计字母,数字和空格
- redis,memcache,mongodb对比
- 【HDU】1595 find the longest of the shortest 枚举+最短路
- java Socket通信
- 网盟学习文章地址
- SQLServer 存储过程简介与使用方法
- C++基础之detele和detele[]
- iOS 8 Extensions
- SQLServer 游标简介与使用说明
- MyBatis入门学习(一)
- C#调用存储过程返回值
- ACM C++读写外挂模板 读写优化
- SqlServer安装错误
- 内核对象详解
- .NET学习笔记(15)使用索引器