inline
可以替换宏定义#define
相比于宏定义,在编译期间在调用处展开,并且会进行类型检查和安全检查,缺点是会增加编译时
间
派生类指针不能指向基类对象
语义混乱,派生类与基类是一个is-a的关系,派生类比基类更加具体,基类更加抽象,用基类指向
派生类指针,是多态实现的基础,而用派生类指向基类指针,比如人是基类,男人女人是派生类,
如果用派生类去指向基类,我们无法认定是男人还是女人,但我们指针是认定了男女的指针,因此
会发生语义的混乱,在实际编程中,派生类指针指向基类也没有什么必要性
野指针
成因:
指针未初始化:指针创建时没有进行初始化,指向随机内存;
指针越界访问:访问超出了申请内存的范围,或者调用函数返回了栈空间的指针或引用,在调
用结束后因为栈空间的释放而无效
指针释放后没有置空:虽然内存得到的释放,但指针仍旧指向对应的内存,也就时无效内存
使用野指针的危害:
指针未初始化:指针的指向位置是随机的,如果指向的位置没有对象,则会报错,如果刚好指
向了某一块已经申请的内存区域,则会造成程序的错误执行
指针越界访问:会触发段错误
指针释放后未置空:在释放后是一个非法的指针,访问程序会出错,但如果程序较长,后续又
对同一块内存进行了申请,会导致指针合法,且由于没有置空,无法判断指针的合法性
防范:
良好的编码规范,在创建指针时及时初始化,释放指针之后及时置空,不要返回栈空间的指针
或者引用,在使用指针前进行合法性检查
delete[] 与 delete
对于简单的内置类型,分配内存时,内存大小已经确定,系统可以记录内存大小的信息,直接释放
对于自定义的类对象数组,加个数组符号除了会释放指针指向的内存,还会调用每一个对象的析构
函数,保证类对象的内存空间都被释放
C++
C++与Python的区别
等同于解释器和编译器的区别:
解释器是一行一行地对源代码或者源代码内部形式直接进行解释执行,编译器是对代码整体进
行编译生成目标文件执行
解释器效率较低,因为同一行代码可能在解释过程中被多次调用多次经历解释的过程,编译器
一次性编译成机器能识别的语言
解释器访问变量较慢,因为标识符到存储位置的映射在运行时重复进行,编译器直接给变量分
配内存
解释器不需要额外的内存空间来存储中间代码,编译器会生成中间代码
解释器一次仅显示一次错误,就发生在解释失败的第一行,编译器一次性返回编译期间的所有
错误,可能会发生混淆