C++03:总结

虚函数

虚函数是C++中实现多态性的特殊函数,当一个类中包含至少一个虚函数时,就被称为虚类或抽象类。

这些虚函数由子类重写,使得它们可以根据需要对基类的行为进行扩展和修改。

通过使用虚函数可以实现动态绑定和运行时多态

 

基类的析构函数是虚函数

C++基类的析构函数声明为虚函数是为了确保在通过基类的指针或者引用删除派生类时,可以正确地释放派生类对象所占用的内存。

如果基类的析构函数不是虚函数,则在这种情况下只会调用基类的析构函数,而不会调用派生类的析构函数,从而可能导致内存泄漏

 

C/C++内存

内存分为堆 栈 程序代码区 全局/静态存储区和常量存储区

C++中还有自由存储区

 

C++堆栈

堆存放动态分配的对象,生存周期由程序控制

栈用来保存定义在函数内的非static对象,仅在其定义的程序块运行时存在

静态内存用来保存static对象,类static数据成员以及定义在任何函数外部的变量,static对象在使用之前分配,程序结束时销毁

栈和静态内存的对象由编译器自动创建和销毁

 

程序编译过程

程序编译的过程经过预处理、编译、汇编和链接四个过程

 

C++ extern

在C++中,extern关键字用于声明一个已经在别处定义的变量、函数或类的引用,从而允许在一个文件中使用在其他文件中定义的全局变量、函数或者类(global v)

extern关键字还可以用于在多个文件中共享一个函数或类的定义

 

函数调用过程

函数调用前的准备工作

在函数调用之前,需要进行一些准备工作。首先需要将函数的参数压入栈中,以向函数传递参数。其次需要保存当前函数的返回地址,以便在函数调用结束后返回到正确的位置

进入函数调用

调用函数时,程序会跳转到函数代码的入口点。此时,程序会为函数创建一个新的栈,用于存储函数的局部变量、返回值等。栈中包含了多个部分,例如函数参数、局部变量、返回地址等。函数参数通过栈传递,在栈的底部。局部变量被分配在栈的底部,返回地址也保存在栈中

函数内部处理

函数内部会执行具体操作,包括参数的读取、局部变量的声明和使用、逻辑计算、循环或者条件语句等,函数将根据其实现过程来计算参数并进行其他操作,然后返回一个结果,该结果保存在寄存器中

函数返回

当函数执行完毕时,需要将返回值存储,并恢复主函数的栈及处理状态。函数返回时,会跳转回调用它的函数位置,此时程序会弹出函数栈,将返回值传递给调用者,并恢复调用者的寄存器和栈

 

左值和右值

左值是可以寻址的,有名字的非临时的变量或表达式

右值是不能寻址的,没有名字的 临时的生命周期变量或表达式

 

内存泄漏

内存泄漏是指动态存储分配函数动态开辟的内存空间,在使用完后未释放,导致一直占据该内存单元,避免和减少内存泄漏指针越界的错误

动态分配内存的指针最好不要再次赋值

在C++中优先考虑使用智能指针

 

malloc和new的区别

malloc和new都是用于动态分配内存的函数

调用方式不同:malloc是C语言标准库中的函数,需要以函数调用形式,并且需要指定要分配的内存大小,而new是C++关键字,无需指定内存大小

内存分配方式不同:malloc只负责分配内存空间,并返回该内存空间的起始地址,但不会进行初始化。而new除了分配内存空间外,还会自动调用构造函数进行对象初始化

返回值类型不同:malloc返回void类型的指针,需要进行强制类型转换才能够使用。而new返回一个指向已分配内存空间的指针,且不需要进行强制类型转换

内存分配失败时处理方式不同:当内存分配失败时,malloc会返回NULL,并需要手动释放已经分配的内存空间。而new会抛出std::badalloc异常,程序可以通过异常捕获机制来处理

 

delete和free区别

delete和free都可以用来释放动态分配的内存

delete是C++中的运算符,而free是C语言中的函数

delete会自动调用对象的析构函数来清理资源,而free只是简单的释放指针所指向的内存块

delete必须要用于new动态分配的内存,而free必须要用于malloc动态分配的内存

C++中应该使用delete来释放内存,而不是free

 

posted @ 2023-08-10 15:53  言午丶  阅读(18)  评论(0编辑  收藏  举报