C++ 总结三

来源:互联网 发布:sublimetext python 编辑:程序博客网 时间:2024/06/10 23:43

1.栈空间上面的局部变量默认初始化为随机值。

全局整形变量和静态stati整形c变量默认初始值为0。


内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

char *Ptr = NULL;

        Ptr = (char *)malloc(100 * sizeof(char));

Obj    *a = (obj *)malloc(sizeof(obj));   


new 是c++中的操作符,malloc是c 中的一个函数

new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数


从上到下打印二叉树的规律:每一次打印一个结点的时候,如果该结点有子结点,则把该结点的子结点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的结点,重复前面的打印操作,直至队列中所有的结点都被打印出来为止。

二叉树的层序遍历,顾名思义就是按照层序自上而下遍历树中的节点,也就是说从根节点开始入队列,遍历是通过队列的队头节点来遍历的,根节点入队之后调用遍历函数,根节点被访问之后就要出队了,这个时候判断根节点(也就是队头节点)是否含有孩子,如果存在就依次将左孩子节点和右孩子节点入队,这个时候队列中就是根节点的两个孩子节点,循环这个过程,等到队列为空的时候二叉树就遍历结束。

     图的广度优先遍历算法和上述算法的思想差不多,不同的时候在图中没有根节点,你可以随便选择一个节点,当作起始节点,和二叉树的一样入队,访问,出队,判断顶点是否有邻接顶点,如果有邻接顶点,就一次把邻接顶点入队,循环这个过程,当队列为空的时候,本次遍历完成,如果还有没有被访问到的顶点,就再从没有被访问的顶点中随便选择一个作为起始顶点继续遍历。在广度优先遍历算法中使用图的邻接表表示方式的话遍历的速度会比较快。


确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类

的所有对象而言是惟一的

仅有一个实例,提供一个类的静态成员变量,大家知道类的静态成员变量对于一个类的所有对象而言是惟一的。

class Singleton {
public:
    static Singleton* Instance();

protected:

    Singleton();

private:
    static Singleton *instance;
};

Singleton* Singleton::Instance()

{

  if(instance==NULL)

    instance = new Singleton();

  return instance;

}


OSI分层      (7层):物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
TCP/IP分层(4层):网络接口层、              网际层、运输层、                            应用层。
五层协议     (5层):物理层、数据链路层、网络层、运输层、                            应用层。

MAC(Media Access Control)地址,或称为物理地址、硬件地址,用来定义互联网中设备的位置。在 TCP/IP 层次模型中,网络层管理 IP 地址,链路层则负责 MAC 地址。因此每个网络位置会有一个专属于它的 IP 地址,而每个主机会有一个专属于它 MAC 地址。

三次握手:

第一次握手:客户端发送syn包(syn=x)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

四次握手

与建立连接的“三次握手”类似,断开一个TCP连接则需要“四次握手”。

第一次挥手:主动关闭方发送一个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不 会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可 以接受数据。

第二次挥手:被动关闭方收到FIN包后,发送一个ACK给对方,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。
第三次挥手:被动关闭方发送一个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手


什么是死锁,死锁产生的4个条件

  死锁定义:

    在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

  产生条件:

    1:互斥条件        -- 一个资源一次只能被一个进程使用
    2:请求保持条件 -- 一个进程因请求资源而阻塞时,对已经获得资源保持不放 
    3:不可抢占条件 -- 进程已获得的资源在未使用完之前不能强行剥夺
    4:循环等待条件 -- 若干进程之间形成一种头尾相接的循环等待资源的关系

进程间高级通信机制:

1:共享存储器系统(存储器中划分的共享存储区)

  实际操作中对应的是“剪贴板”(剪贴板实际上是系统维护管理的一块内存区域)的通信方式。

2:消息传递系统(进程间的数据交换以消息(message)为单位)

  当今最流行的微内核操作系统中,微内核与服务器之间的通信,都采用 了消息传递机制

3:管道通信系统(连接读写进程实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读))

  管道分为匿名管道、命名管道。匿名管道是未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,不能实现跨网络的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现进程间的通信。

 

4:客户机-服务器系统

    包括:套接字(socket),远程过程调用和远程方法调用




详见  http://blog.csdn.net/21aspnet/article/details/1539951

char str[20]="0123456789"; 
int   a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记。 
int   b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响