最近一直遨游在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申请内存的机制:如果原来指针指向的内存块后还用充足的内存给你申请,那么原来指针和新指针相同,否则,就会找另外一整块满足申请的内存块分配内存,这时候新指针和老指针就不相同了,所以在使用时要搞清楚这问题,判断一下新老指针是否相同。
今天就看了这么多,期待明天