c++----new/delete 以及this指针

更多点子:c++—目录索引(知识小渠道)


this指针的值是当前调用成员函数的对象的起始地址
this指针特性:
1. this指针并不是对象本身的一部分,不影响sizeof的结果
2. this的作用域在类成员函数的内部(不严谨)
3. this指针是类成员函数的第一个默认隐含参数,编译器自动维护传递,类编写者不能显示传递
4.只有在类的非静态成员函数中才可以使用this指针,其他任何函数都不可以

this有可能指向NULL,可以定义一个类对象指针并使其初始化为NULL

关于this的几个小点:
1. this在成员函数的开始执行前构造的,在成员函数的执行结束后清除
2. this会因编译器不同,而放置的位置不同没可能是栈,也可能是寄存器,甚至于全局变量
3. 类和结构是只有一个区别:类的成员默认是private,而结构是public。this是类的指针,如果换成结构,那this就是结构的指针
4. this指针只有在成员函数中才有定义。所以,获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。在成员函数里,你是可以知道this指针的位置的(&this),也可以直接使用
5. 普通的类函数(不管是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数
6. 大多数编译器通过exc寄存器传递this指针。一般来说,不同编译器都会遵从一致的传参规则,否则不同编译器产生的obj就无法匹配了。在call之前,编译器会把对应的对象地址放到eax中。this是通过函数参数的首参来传递的。类在实例化时,只从类的函数定义完成后,它就在那儿,不会跑的
7. 静态成员函数并不是针对某个类的实例对象,而是属于整个类的,为所有的对象实例所共有。它在作用域的范围内是全局的,独立于类的对象之外的,它只对类内部的静态成员变量做操作。this指针是相当于一个类的实例的指针,this是用来操作对象实例的内容的,既然静态成员函数和变量都是独立于类的实例对象之外的,它就不能用this指针,也不能操作非静态成员

c++动态内存管理:
c++通过new和delete动态管理内存(C语言使用malloc/calloc/realloc/free)进行动态内存管理
**1.**new/delete动态管理对象
**2.**new[]/delete[]动态管理对象数组

void test()
{
    int *p1 = new int;//动态分配4个字节的空间单个数据
    int *p2 = new int(3);//动态分配4个字节的空间并初始化为3
    int *p3 = new int[3];//动态分配12个字节的空间(3个int)
    delete p1;
    delete p2;
    delete[] p3;
}

malloc/free、new/delete、new[]/delete[],这几个一定要匹配使用,否则可能出现内存泄露甚至崩溃
1. malloc–delete—–野指针
2. new–free—–内存泄露
3. new[]–delete—–崩了,少释放四个字节

malloc/free和new/delete:
1. malloc/free只是动态分配内存空间/释放空间,new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理
2. malloc/free需要手动计算类型大小并且返回值void*,new/delete可自己计算类型的大小,返回对应类型的指针
3. malloc 失败了返回0,new 失败了返回异常

如果有什么不对的地方,可以评论告诉我,望指导!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值