malloc/free组合与new/delete组合的理解

最近一直遨游在python、java 的海洋中,很长时间没有阅读c/c++的书籍了。今天莫名的十分想念我的启蒙编程语言(c语言),可能不太通顺,就这样吧。从今天起每天都会学习一点c语言的东西,遇到的问题也会登陆到csdn上,就当是备忘录把,今天刚看了备忘录模式,也show一把,下面开始:

就从java、python和C/C++不同点开始吧,内存管理

我们都知道,java、python程序员不怎么需要关心内存的东西(其实也要十分关心,比如java中强引用、弱引用等,还有引用变量赋值空等,只是看起来不像c/c++那么严重),但是C/C++中程序员就需要十分注重内存的申请和释放,尤其是涉及到各种抽象空间的时候,否则,你的程序跑不了多久,就挂掉了,或者死掉了,这就是内存泄露导致的。各种公司对避免内存泄露都会采取措施,比如有的公司明确要求,任何代码都要自己写,不能借用其他的开源库,甚至STL中的函数也不能使用。有时候内存泄露很隐蔽,很难定位,下面就理解一下,c/C++中申请释放内存的组合:malloc/free组合与new/delete组合

首先,malloc/free和new/delete组合都能申请释放内存,malloc/free是c/c++标准库中的函数,而new/delete是c++中的运算符

其次,对于非内部数据类型,也就是自己定义的类型(class类),可以用malloc来申请内存创建对象,但是申请内存创建对象时并没有调用类的构造函数,也就是没有初始化,只是申请出来了类大小的内存,还需要自己初始化,new就不同了,申请内存的同时,自动调用构造函数进行了对象初始化,new一步干完的事,malloc要分两步,用哪个自己考虑。同理free和delete区别也类似,delete执行时,调用类的析构函数,free不能调用析构函数,析构函数里面干的事需要手动去处理。为什么会这样呢,因为malloc/free是函数,new/delete是运算符,编译器内可以控制。

再次,申请内存时,malloc需要指定内存大小,并且要做类型强制转换;new就不需要了,new在申请内存是会自行计算空间大小,并且自行做类型转换(类型安全)

最后,两者都需要配对使用,并且都是在堆上申请内存。

差不多就这些把(就想起来这些),总之在c++中最好使用new组合,那为什么c++中还有malloc组合内,因为很时候c++程序会调用c代码程序,所以兼容。

在申请内存是,还遇到过realloc的情况,这个函数使用时要注意,稍不注意就会出问题

realloc申请内存的机制:如果原来指针指向的内存块后还用充足的内存给你申请,那么原来指针和新指针相同,否则,就会找另外一整块满足申请的内存块分配内存,这时候新指针和老指针就不相同了,所以在使用时要搞清楚这问题,判断一下新老指针是否相同。

今天就看了这么多,期待明天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值