1.上下文(context)
2. 全局域内的函数声明将引入全局函数(global function)
3.全局域内的变量将引入全局对象(global object)
4.生命期(lifetime)
5.函数声明(declaration) 指定了该函数的名字以及函数的返回类型和参数列表
6.函数定义(definition)还为函数提供了函数体
7.extern为声明但不定义一个对象提供了一种方法. --承诺了该对象会在其他地方被定义
    extern 声明不会引起内存被分配
8.c++中有一种机制, 通过它可以把函数参数的类型和数目编码在函数名中, 改机制叫做类型安全链接(type-safe-linkage)
9.不同文件中出现同一对象或函数声明的其他类型不匹配情况, 在编译或链接时可能不会被捕捉到, 因为编译器一次只能处理一个文件, 他不能很容易地检

查到文件之间的类型违例, 这些类型违例可能是程序严重错误的根源
10.头文件为所向extern对象声明, 函数声明以及inline函数定义提供了一个集中的位置: 这被称作声明的局部化(localization)
11.头文件提供了两个安全保证
    保证所有文件都包含同一个全局对象或函数的同一份声明
    如果需要修改声明, 则只需要改变一个头文件
    --只在本cpp用的全局函数, 该不该定义在头文件里面?
12.局部对象(local object)
   自动对象(automatic object)  --程序运行栈
   寄存器对象(register object) --如果所选择的变量被频繁使用, 则寄存器变量可以提高函数的执行速度
   局部静态对象(local static object)
13.当一个自动变量的地址呗存储在一个生命期长与它的指针时, 该指针被称为空悬指针(dangling pointer)
14.动态分配的对象被分配在程序的空闲存储区(free store)的可用内存池中
15.new表达式失败时, 通常会抛出bad_alloc异常
16.应用delete表达式失败, 使内存无法返回空闲存储区, 称作内存泄露(memory leak)
17.对用一内存应用了两次delete表达式, 通常发生在两个指针指向同一个动态分配对象的时候, 这是一个很难跟踪的问题
18.在对象被释放后读写该对象, 这常常会发生, 因为delete表达式应用的指针没有被设置为0
19.为帮助程序员更好地管理动态分配的内存, c++库提供了auto_ptr类类型的支持 --智能指针
20.auto_ptr类模板头文件<memory>
    auto_ptr<int>pi(new int(1024));
    //pi是局部智能指针, 当pi生命期结束时候, 会自动释放pi指向的堆空间
    为了判断auto_ptr对象是否指向了一个对象, 可以用操作get()返回auto_ptr对象内部的底层指针
    if(p_auto_int.get() != 0 && *p_auto_int != 1024) { ... }
21.在某些情况下, 小细节会积聚成可怕的性能瓶颈, 这些细节不应该烦扰那些试图为整个程序提供解决方案的人, 但是这些细节是有经验的程序员应该考虑

22.定位new表达式
    new表达式可以允许程序员要求将对象创建在已经被分配好的内存中, 这种形式的new表达式被称为定位new表达式(placement new expression)
    new (place_address) type -specifier
    place_address必须是个指针
    头文件<new>
    byte *mem = new byte[4096]; //这个是自定义内存池?
    char *tmp = new(mem) char; //在内存池分配一个char来用?
    delete [] mem;