聚搜济南网站建设公司,用wordpress建站多少钱,想做棋牌网站怎么做,游戏网站logo制作文章目录 #x1f308; Ⅰ C 内存分布#x1f308; Ⅱ C 内存管理方式1. new 和 delete 操作内置类型2. new 和 delete 操作自定义类型 #x1f308; Ⅲ operator new 和 operator delete#x1f308; Ⅳ new 和 delete 的实现原理1. 内置数据类型2. 自定义数据类型 #… 文章目录 Ⅰ C 内存分布 Ⅱ C 内存管理方式1. new 和 delete 操作内置类型2. new 和 delete 操作自定义类型 Ⅲ operator new 和 operator delete Ⅳ new 和 delete 的实现原理1. 内置数据类型2. 自定义数据类型 Ⅴ malloc / free 和 new / delete 的区别 Ⅰ C 内存分布
C 中程序内存区域划分
内存区域说明内核空间用户代码不能读写栈向下增长 ↓存储定义在函数内的局部变量内存映射段文件映射、动态库、匿名映射堆向上增长 ↑用于存储动态开辟出来的空间数据段也叫静态区用于存包处全局数据、静态数据代码段存储可执行代码 / 只读常量 Ⅱ C 内存管理方式
C 中通过 new 和 delete 操作符来替代 C语言 中 malloc 和 free 的功能。
1. new 和 delete 操作内置类型
1. new 和 delete 操作内置类型格式
创建和删除 单个 对象
内置类型* 对象名 new 内置类型;delete 对象名;创建和删除 多个 对象
内置类型* 对象名 new 内置类型(你要 new 出来的数量);delete[] 对象名;2. new 和 delete 操作内置类型示例
这里主要采用 int 类型作为演示其他 C 内置的数据类型也可以这么整。 2. new 和 delete 操作自定义类型
在申请自定义类型的空间时new 会调用构造函数delete 会调用析构函数。
1. new 和 delete 操作自定义类型格式
创建和删除 单个 对象
自定义类型名* 对象名 new 自定义类型名(传给构造函数的参数);delete 对象名;创建和删除 多个 对象
自定义类型名* 对象名 new 自定义类型名[创建对象的数量];delete[] 对象名;2. new 和 delete 操作自定义类型示例
class date
{
public:date(int year 1, int month 1, int day 1):_year(year),_month(month),_day(day){cout 这是一个构造函数 endl;}~date(){cout 这是一个析构函数 endl;}
private:int _year;int _month;int _day;
};int main()
{date* d1 new date; // new 一个日期类东西并用缺省参数调用构造函数初始化date* d2 new date(2024,2, 9); // new 一个日期类对象并用所给的值调用构造函数初始化date* d3 new date[3]; // new 三个日期类对象并对每个对象使用缺省参数初始化delete d1; // 删除 new 出来的单个对象delete d2;delete[] d3; // 删除 new 出来的多个对象return 0;
}Ⅲ operator new 和 operator delete
概念
operator new 和 operator delete 是全局函数不是对 new 和 delete 的重载。new 在底层调用 operator new 函数申请空间delete 则调用 operator delete 函数释放空间。operator new 是对 malloc 的封装operator delete 是对 free 的封装。
本质
operator new 实际上是通过 malloc 来申请空间如果 malloc 申请空间成功就直接返回否则执行用户提供的空间不足应对措施如果用户提供该措施就继续申请否则就抛异常。operator delete 实际上是通过 free 来释放空间 。 Ⅳ new 和 delete 的实现原理
1. 内置数据类型
如果申请的是内置类型的空间new 和 mallocdelete 和 free 基本类似。不同的地方是 new / delete 申请和释放的是单个元素的空间new [] 和 delete[] 申请和释放的是连续的空间。new 在申请空间失败时会抛出异常而 malloc 是返回 NULL。
2. 自定义数据类型
1. new 和 delete 的原理
new先调用 operator new 函数申请空间再在申请的空间上执行构造函数。delete先在空间上执行析构函数完成对象中资源的清理工作。再调用 operator delete 函数去释放对象的空间。 2. new T[n] 和 delete[] 的原理
new T[n]先调用 operator new[] 函数在 operator new[] 函数中调用 operator new 函数完成对 n 个对象空间的申请。最后在申请的空间上执行 n 次构造函数。delete[]先在释放的对象空间上执行 n 次析构函数。再调用 operator delete[] 释放空间实际是在 operator delete[] 中调用 operator delete 来释放空间。 Ⅴ malloc / free 和 new / delete 的区别
1. 共同点
都是从堆上申请空间并且都需要用户主动释放。
2. 不同点
malloc 和 free 是函数而 new 和 delete 是操作符。malloc 申请的空间不会被初始化new 可以初始化申请的空间。malloc 申请空间时还需要手动计算空间的大小并传递给 malloc 函数。new 只需要在后面跟上该对象的类型即可如果要 new 多个对象只需在 [] 中指定对象个数即可。malloc 的返回值为 void*在使用时必须要进行强转。而 new 因为后面跟着该空间的类型因此不需要对返回值进行强转。malloc 需要手动检查是否开辟空间失败。new 失败了是抛异常不需要手动检查。申请自定义类型对象时malloc / free只会开辟空间。而 new 在申请空间后会调用构造函数完成对象的初始化delete 在释放空间前会调用析构函数。