1. 强类型枚举

C++中的enum的设定是:具名的enum类型的名字以及enum的成员名字都是全局可见的,这与C++中具名的namespace、class以及union必须通过 名称::成员名 的方式访问是格格不入的。
此外C中枚举被设计为常量数值的别名的本性,所以枚举成员总可以被隐式地转换为整型,很多时候是不安全的。 :::danger 非强类型作用域,允许隐式转换为整型,占用存储空间以及符号性不确定都是枚举类的缺点。C++11引入一种新的枚举类型,即:枚举类或者强类型枚举 :::

  1. enum class Type {General,Light,Medium,Heavy};

强枚举类型的优势: :::warning

  • 强作用域
  • 转换限制:强类型枚举成员的值不可以与整形隐式转换。
  • 可以指定底层类型,默认是int,但是可以显示地指定底层类型。在枚举名称后面加上 :type. :::

    2. 堆内存管理:智能指针和垃圾回收

    显式内存管理

    堆内存管理的问题:
    • 野指针:内存单元已经被释放,但是之前指向它的指针还在使用
    • 重复释放:试图去释放已经释放过的内存单元
    • 内存泄露:不需要使用的内存单元没有被释放

C++11的智能指针

C++11中使用unique_ptr、shared_ptr、weak_ptr等智能指针来自动回收堆分配对象

  1. #include<memory>
  2. #include<iostream>
  3. using namespace std;
  4. int main(){
  5. unique_ptr<int> up1(new int(11));
  6. unique_ptr<int> up2=up1;//wrong
  7. unique_ptr<int> up3=move(up1);//right
  8. up3.reset(); //显示释放
  9. up1.reset(); //不会重复释放
  10. shared_ptr<int> sp1(new int(22));
  11. shared_ptr<int> sp2=sp1;
  12. sp1.reset();
  13. cout<<*sp2<<endl;
  14. }
  • unique_ptr与所指对象内存紧密绑定,不能与其他的unique_ptr类型共享对象的内存,此外这种所有权只能通过move函数来转移。一旦转移成功,源对象失去所有权。
  • shared_ptr允许多个同类型的智能指针共享拥有同一堆分配对象的内存,实现上采用引用计数。只有当所有指向该内存的智能指针都释放后,内存才会被释放。
  • weak_ptr允许指向shared_ptr指针指向的对象内存,但是却不拥有该内存,可以使用其成员lock返回指向内存的一个shared_ptr对象。所指对象失效时返回nullptr