1. 强类型枚举
C++中的enum的设定是:具名的enum类型的名字以及enum的成员名字都是全局可见的,这与C++中具名的namespace、class以及union必须通过 名称::成员名 的方式访问是格格不入的。
此外C中枚举被设计为常量数值的别名的本性,所以枚举成员总可以被隐式地转换为整型,很多时候是不安全的。
:::danger
非强类型作用域,允许隐式转换为整型,占用存储空间以及符号性不确定都是枚举类的缺点。C++11引入一种新的枚举类型,即:枚举类或者强类型枚举
:::
enum class Type {General,Light,Medium,Heavy};
强枚举类型的优势: :::warning
- 强作用域
- 转换限制:强类型枚举成员的值不可以与整形隐式转换。
- 可以指定底层类型,默认是int,但是可以显示地指定底层类型。在枚举名称后面加上
:type
. :::2. 堆内存管理:智能指针和垃圾回收
显式内存管理
堆内存管理的问题:- 野指针:内存单元已经被释放,但是之前指向它的指针还在使用
- 重复释放:试图去释放已经释放过的内存单元
- 内存泄露:不需要使用的内存单元没有被释放
C++11的智能指针
C++11中使用unique_ptr、shared_ptr、weak_ptr等智能指针来自动回收堆分配对象
#include<memory>
#include<iostream>
using namespace std;
int main(){
unique_ptr<int> up1(new int(11));
unique_ptr<int> up2=up1;//wrong
unique_ptr<int> up3=move(up1);//right
up3.reset(); //显示释放
up1.reset(); //不会重复释放
shared_ptr<int> sp1(new int(22));
shared_ptr<int> sp2=sp1;
sp1.reset();
cout<<*sp2<<endl;
}
- unique_ptr与所指对象内存紧密绑定,不能与其他的unique_ptr类型共享对象的内存,此外这种所有权只能通过move函数来转移。一旦转移成功,源对象失去所有权。
- shared_ptr允许多个同类型的智能指针共享拥有同一堆分配对象的内存,实现上采用引用计数。只有当所有指向该内存的智能指针都释放后,内存才会被释放。
- weak_ptr允许指向shared_ptr指针指向的对象内存,但是却不拥有该内存,可以使用其成员lock返回指向内存的一个shared_ptr对象。所指对象失效时返回nullptr