• C++应用程序实用memory的途径

    image-20210626160209890

  • C++ memory primitives

    image-20210626155952846

    image-20210626160017978

  • new expression

    image-20210626155629132

    上图中,只有编译器才能调用构造函数(否则报错,示例如下图)。 不能由App.调用构造函数, 可用placement new调用

    image-20210626155835196

  • delete expression

    先调用析构函数,然后释放内存

    image-20210626155759951

  • ==placement new== (具体指 new(p)::operator new(size, void)* )

    • 允许将object 构造在allocated memory中。没有所谓的 placement delete,因为placement new根本没分配memory与placement new 对应的operator delete为 placement delete

      image-20210626154821433

    • 等同于调用 构造函数,因为下图的第一步实际上没有做事

      image-20210626155000625

  • 重载(overload)

    后面将路线2转为路线1即 为重载

    image-20210626155534404

    C++容器分配内存的途径

    image-20210626160923954

    • 重载 ::operator new/ ::operator delete

      image-20210626161428120

    • 重载operator new/operator delete

      image-20210626161529258

    • 重载operator new[]/operator delete[]

      image-20210626161748505

    • 示例

      image-20210626162423597

      image-20210626162443597

      image-20210626162458469

      不同的写法:::delete 这样等同于 global scope operator ::, 会绕过前述所有overload functions,强迫使用global version

    • 重载new() / delete()

      参数不同, 第一个参数必须是size_t ,其余参数以new所指定的placement arguments为初值

      image-20210626162932369

      重载示例:

      image-20210626163144651

      image-20210626163314990

      operator delete 用来处理构造过程异常时调用的,因此 其与operator new(…)不一一对应也不会出现任何错误

      basic string 即为 string,使用typedef后的

    image-20210626164205560

  • pre-class allocator

    • Case 1

    内存池的一个例子

    image-20210626165000900

    image-20210626165137977

    右边的结果是因为 类中没写 operator new/delete,默认内存中会带有cookie(上下都有四个字节,一共8个字节)

    • Case 2

      union的使用, 将AirplaneRep看作一个指针

    image-20210626165653042

    image-20210626193845237