正规网站建设定制,有.net源码如何做网站,建网站收费,wordpress 注册推广文章目录 写在前面1. CC内存分布2. C语言中动态内存管理方式#xff1a;malloc/calloc/realloc/free3. C内存管理方式#xff08;语法#xff09;3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. new和delete的实现原理4.1 operator new与operator delete… 文章目录 写在前面1. CC内存分布2. C语言中动态内存管理方式malloc/calloc/realloc/free3. C内存管理方式语法3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. new和delete的实现原理4.1 operator new与operator delete函数4.2 实现原理4.2.1 内置类型4.2.2 自定义类型 5. 定位new表达式(placement-new)(了解) 写在前面
本篇文章先讨了C/C程序中的内存分布并简单介绍了各个内存段的作用和特点。在此基础上又着重讨论了C语言和C语言中的动态内存管理方式包括malloc()、free()等C语言函数以及new和delete等C语言操作符。进一步探讨了operator new和operator delete函数在C中的作用和使用方式并揭示了new和delete的实现原理。最后对定位new表达式placement-new进行了解析介绍了它在特定场景下的应用及实现原理。
1. CC内存分布 上面图片介绍了C/C程序中的内存分布并详细介绍了各个内存段的作用和特点。 下面我们通过一段代码和相关问题来深入理解C/C程序中的内存分布。
int globalVar 1;
static int staticGlobalVar 1;
void Test()
{static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] abcd;const char* pChar3 abcd;int* ptr1 (int*)malloc(sizeof(int) * 4);int* ptr2 (int*)calloc(4, sizeof(int));int* ptr3 (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);
/* 1. 选择题选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里__c__ staticGlobalVar在哪里__c__staticVar在哪里__c__ localVar在哪里__a__num1 在哪里__a__char2在哪里____ *char2在哪里___pChar3在哪里____ *pChar3在哪里____ptr1在哪里____ *ptr1在哪里____
2. 填空题sizeof(num1) ____; sizeof(char2) ____; strlen(char2) ____;sizeof(pChar3) ____; strlen(pChar3) ____;sizeof(ptr1) ____;
3. sizeof 和 strlen 区别
}*/2. C语言中动态内存管理方式malloc/calloc/realloc/free
C语言中动态内存管理方式malloc/calloc/realloc/free的详细介绍有兴趣的读者可以参考之前写的文章动态内存管理malloc calloc realloc free— C语言[点击蓝色字体跳转]这里就不在赘述。
3. C内存管理方式语法
C语言内存管理方式在C中可以继续使用但有些地方就无能为力而且使用起来比较麻烦。例如在C语言中使用 malloc 和 free 进行内存分配和释放时需要手动计算申请内存空间的大小并且需要对返回值进行强制类型转换容易出错。
因此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。在C中它们不仅可以用于内置类型例如 int、double 等还可以用于自定义类型例如类、结构体等。下面我们来一一介绍。
3.1 new/delete操作内置类型
int main()
{// 动态申请一个int类型的空间int* pa new int;// 动态申请一个int类型的空间并初始化为10int* pb new int(10);// 动态申请10个int类型的空间int* nums1 new int[10];// 动态申请10个int类型的空间,并用{1, 2, 3, 4}初始化不完全初始化剩下的默认初始化为0。int* nums2 new int[10] {1, 2, 3, 4};delete pa;delete pb;delete[] nums1;delete[] nums2;return 0;
}注意申请和释放单个元素的空间使用new和delete操作符申请和释放连续的空间使用new[]和delete[]注意匹配起来使用。
3.2 new和delete操作自定义类型
class A
{
public:A(int a 0):_a(a){cout A(int a 0) endl;}~A(){cout ~A() endl;}
private:int _a;
};int main()
{//malloc 和 new 最大的区别是对于自定义类型除了会开空间以外new 还会调用构造函数完成对对象的初始化A* pa1 new A;A* pa2 (A*)malloc(sizeof(A));//free 和 delete 最大的区别是对于自定义类型除了会释放空间以外还会调用析构函数来完成对对象中资源的清理delete pa1;free(pa2);return 0;
}注意在申请自定义类型的空间时new会调用构造函数delete会调用析构函数而malloc与free不会。 new/delete 和 malloc/free对于内置类型 是几乎是一样的只是用法不同罢了。
4. new和delete的实现原理
4.1 operator new与operator delete函数
new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是 系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间。 通过上述两个全局函数的实现知道operator new 实际也是通过malloc来申请空间如果malloc申请空间成功就直接返回否则执行用户提供的空间不足应对措施如果用户提供该措施就继续申请否则就抛异常。operator delete 最终是通过free来释放空间的。 operator new 和operator delete是系统提供的全局函数因此可以显示的调用平常不会这样使用了解。
4.2 实现原理
4.2.1 内置类型
如果申请的是内置类型的空间new和mallocdelete和free基本类似不同的地方是 new/delete申请和释放的是单个元素的空间new[]和delete[]申请和释放的是连续空间。 new在申请空间失败时会抛异常malloc会返回NULL。
4.2.2 自定义类型
new的原理
调用operator new函数申请空间。在申请的空间上执行构造函数完成对象的构造。
delete的原理
在空间上执行析构函数完成对象中资源的清理工作。调用operator delete函数释放对象的空间。
new T[N]的原理
调用operator new[]函数在operator new[]中实际调用operator new函数完成N个对象空间的申请。在申请的空间上执行N次构造函数。
delete[]的原理
在释放的对象空间上执行N次析构函数完成N个对象中资源的清理。调用operator delete[]释放空间实际在operator delete[]中调用operator delete来释放空间。
5. 定位new表达式(placement-new)(了解)
定位new表达式在实际中一般是配合内存池使用。因为内存池分配出的内存没有初始化所以如果是自定义类型的对象需要使用new的定义表达式进行显示调构造函数进行初始化。 至此本片文章就结束了若本篇内容对您有所帮助请三连点赞关注收藏支持下。
创作不易白嫖不好各位的支持和认可就是我创作的最大动力我们下篇文章见
如果本篇博客有任何错误请批评指教不胜感激