[C++]内存管理
文章目录
-
C++应用程序实用memory的途径
-
C++ memory primitives
-
new expression
上图中,只有编译器才能调用构造函数(否则报错,示例如下图)。 不能由App.调用构造函数, 可用placement new调用
-
delete expression
先调用析构函数,然后释放内存
-
==placement new== (具体指 new(p) 或 ::operator new(size, void)* )
-
允许将object 构造在allocated memory中。没有所谓的 placement delete,因为placement new根本没分配memory 或 与placement new 对应的operator delete为 placement delete
-
等同于调用 构造函数,因为下图的第一步实际上没有做事
-
-
重载(overload)
后面将路线2转为路线1即 为重载
C++容器分配内存的途径
-
重载 ::operator new/ ::operator delete
-
重载operator new/operator delete
-
重载operator new[]/operator delete[]
-
示例
不同的写法:::delete 这样等同于 global scope operator ::, 会绕过前述所有overload functions,强迫使用global version
-
重载new() / delete()
参数不同, 第一个参数必须是size_t ,其余参数以new所指定的placement arguments为初值
重载示例:
operator delete 用来处理构造过程异常时调用的,因此 其与operator new(…)不一一对应也不会出现任何错误
basic string 即为 string,使用typedef后的
-
-
pre-class allocator
- Case 1
内存池的一个例子
右边的结果是因为 类中没写 operator new/delete,默认内存中会带有cookie(上下都有四个字节,一共8个字节)
-
Case 2
union的使用, 将AirplaneRep看作一个指针
文章作者 fzhiy
上次更新 2021-06-27