1、new/delete、 malloc/free
内存泄漏是指堆内存(heap memory)的泄漏(memory leak)。堆内存指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配内存,使用完后,程序必须负责相应的调用free或delete释放该内存,否则,这块内存就不能被再次使用,即这块内存泄漏了。 malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
向下生长,由编译器自动分配释放 ,存放函数的参数值,局部变量的值等,内存的分配是连续的,类似于平时我们所说的栈,如果还不清楚,那么就把它想成数组,它的内存分配是连续分配的,即,所分配的内存是在一块连续的内存区域内.当我们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存.
b、堆区(heap)
向上生长(从低地址开始存放),一般由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收.类似于链表,在内存中的分布不是连续的,它们是不同区域的内存块通过指针链接起来的.一旦某一节点从链中断开,我们要人为的把所断开的节点从内存中释放.
c、全局/静态存储区(static)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 程序结束后由系统释放
d、只读区
存放程序和常量,比如const int a = 2; char *p = "abc"; 这里的a和“abc”都存放在可读写区。
4、指针以及相关问题
指针是存放地址的变量。指针所占的存储空间和操作系统有关,32位操作系统占4个字节,64位操作系统占8个字节。
例题:64位系统上定义的变量int* a[2][3]占据 2*3*8 个字节
&运算符
在C语言中有两种含义:1、位操作符,表示‘位与’;2、取地址运算符,比如int a = 10,*p = &a;
在C++中除了上述两种含义外还有一种含义:引用,比如int a, &b = a;//a和b等价,共享一个存储空间,a,b的值同时变化。
常量指针和指针常量
常量指针:指针所指向的对象只能被读取,而指针本生的值可以修改,比如:int a,b;
const int *p = &a; p = &b;
指针常量:不能修改指针本生的值,但可以修改指针所指向的对象的值,比如int a = 10;
Int * const p = &a; *p = 20;
常量
常量是不能修改的,存放在内存的只读区,入如const int a = 10; char *p = "abc";这里的a和字符串abc都是常量,只能读,不能修改。
函数指针和指针函数
函数指针也是一个指针变量,它指向函数的入口地址。
int (*f)(int a, int b); // 声明函数指针, 函数指针定义为一个指向一个返回值为整型,有两个参数并且两个参数的类型都是整型的函数。
指针函数是一个函数,这个函数的返回值是一个指针。
int *f(int a, int b); //指针函数声明,该函数有两个整形参数,返回值是一个指针
找不到该页面:404
禁止访问:403
内部服务器访问:500
服务器繁忙:503
6、构造函数与虚构函数
a、当派生类中不含对象成员(类的某个成员是对象)时
在创建派生类对象时,构造函数的执行 顺序是:基类的构造函数→派生类的构造函数;
在撤消派生类对象时,析构函数的执行 顺序是:派生类的构造函数→基类构造函数。
b、当派生类中含有对象成员时
在定义派生类对象时,构造函数的执行顺序:基类的构造函数→对象成员的构造函数→派生类的构造函数;
在撤消派生类对象时,析构函数的执行顺序:派生类的构造函数→对象成员的构造函数→基类的构造函数。
7、进程的状态以及转化
进程的三种基本状态
进程在运行中不断地改变其运行状态。通常,一个运行进程必须具有以下三种基本状态。
a 、就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
b 、执行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
c、 阻塞(Blocked)状态(即等待状态)
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
进程三种状态间的转换
一个进程在运行期间,不断地从一种状态转换到另一种状态,它可以多次处于就绪状态和执行状态,也可以多次处于阻塞状态。
(1) 就绪→执行
处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2) 执行→就绪
处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状 态。
(3) 执行→阻塞
正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
(4) 阻塞→就绪
处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
例题:进程进入等待状态有哪几种方式?(D)
A CPU调度给优先级更高的线程 //运行到等待
B 阻塞的线程获得资源或者信号//等待到就绪
C 在时间片轮转的情况下,如果时间片到了//运行到就绪
D 获得spinlock未果 //运行到等待
5、类的基本知识点
1、封装性
类包含成员数据和成员函数,一般将成员数据定义成私有,外部代码通过公有的成员函数对其访问,成员函数相当于提供了访问成员数据的一个接口,从而实现了对成员数据的封装。
注意:私有成员函数只可以被该类的成员函数访问
保护成员只可以被基类或者是派生类的成员函数访问
公有成员可以通过申请对象进行访问
2、继承性
3、多态性——一个接口,多中方法
基类指针能够指向它派生出来的派生类是实现C++多态性的关键。
运行时的多态性通过虚函数和继承一起来实现。
虚函数:在基类中定义为virtual函数,在派生类中可以重新定义。
多态类:有虚函数的基类,或者是继承有虚函数的基类的派生类。
纯虚函数:在基类中没定义,在派生类中一定要定义的函数。
抽象类:含有纯虚函数的类(不能声明对象,但可以声明指针)