迭代器失效的三种情况
虚假唤醒
在 C++ 中,虚假唤醒是指线程在等待一个条件变量时被唤醒,但是在检查等待条件后发现条件仍然不满足。这种情况可能是由于多线程竞争和同步问题造成的。
在 C++ 中使用条件变量时,通常会使用 std::condition_variable 类来同步线程。当一个线程等待条件变量时,它会调用 std::condition_variable::wait() 函数。此函数会阻塞线程,直到另一个线程调用 std::condition_variable::notify_one() 或 std::condition_variable::notify_all() 函数唤醒它。
如果你的线程在等待条件变量时遇到虚假唤醒的情况,则可能需要在等待条件时使用循环来避免这种情况。这样,当线程被唤醒时,它就可以在检查等待条件后再次调用 std::condition_variable::wait() 函数,如果条件仍然不满足就再次等待。
c++ 14 标准
1.泛型的lambda表达式
auto lambda=[auto x, auto y](){return x +y;}
2.lambda 捕获表达式
可以捕获右值
3.函数返回类型推导
4.decltype 类型推倒
5.变量模板
取消特性 optional 可能含有或者不含有一个值
oop 面向对象的六大原则
-
单一职责:对象设计要求独立,不能设计万能对象。
-
开闭原则:对扩展开放,对修改关闭
-
里式替换:程序扩展中抽象被具体可以替换(接口、父类、可以被实现类对象、子类替换对象)
-
迪米特:高内聚,低耦合。尽量不要依赖细节。
-
依赖倒置:面向抽象编程。也就是参数传递,或者返回值,可以使用父类类型或者接口类型。从广义上讲:基于接口编程,提前设计好接口框架。
-
接口隔离:接口设计大小要适中。过大导致污染,过小,导致调用麻烦。
1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。但是new能够自动分配空间大小,而malloc需要计算字节数。
2.对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。---简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。