1、 关于拷贝控制这一块的内容太多且琐碎,需要的时候再翻书。
- 引用限定符必须同时出现在函数的声明和定义中,其作用是限定向左值赋值还是向右值赋值。
- 当同时有const限定符时,引用限定符要加在const限定符后面。
- 引用限定符也可以区分重载版本。
- 如果一个成员函数有引用限定符,则具有相同参数列表的所有版本都必须有引用限定符。
class Foo {
public:
Foo& operator=(const Foo&) &; //只能向可修改的左值赋值
};
Foo& Foo::operatpr=(const Foo& rhs) & {
//
return *this;
}
2、类中vector的初始化问题
在力扣刷题的时候,经常会使用vector,今天在使用时就遇到了问题:在类的成员函数之外定义并初始化vector时出现了错误,然后我就试验了一下:
class Test {
public:
vector<int> v1(10,0); //错误;
vector<int> v2(10); //错误;
vector<int> v3{1,2,3}; //正确;
vector<int> v4={1,2,3}; //正确;
vector<int> v5=vector<int>(5); //正确;
vector<int> v6=vector<int>(5,0); //正确;
通过上面的例子来看,成员变量vector似乎不能直接初始化,只能使用拷贝初始化。原因未知,我猜应该与vector的构造函数或者拷贝构造函数有关,记录一下。
3、死锁
-
定义:是指两个以上的进程在运行过程中因争夺资源而造成相互等待的现象, 若无外力作用,他们将无法再向前推进。
-
原因: 系统资源不足 进程运行推进的顺序不合适 资源分配不当
-
产生的必要条件
互斥条件:一个资源只能被一个进程使用
请求与保持条件:一个进程因请求资源而阻塞时,对以获得的资源保持不放。
不可剥夺条件:进程已经获得资源,在未使用完之前,不能强行剥夺
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 -
死锁的解除和预防:
解除:破坏四个产生死锁的必要条件之一即可(资源一次性分配,只要有一个资源的不到分配就不给他分配其他资源,可剥夺资源,资源有序分配法)
预防:确定顺序获得锁,超时放弃(银行家算法) 死锁检测:jstack命令,jconsole工具