【C++复习专题】——内存管理

打印 上一主题 下一主题

主题 1004|帖子 1004|积分 3012

1. C/C++内存分布

  1. int globalVar = 1;
  2. static int staticGlobalVar = 1;
  3. void Test()
  4. {
  5.     static int staticVar = 1;
  6.     int localVar = 1;
  7.     int num1[10] = {1, 2, 3, 4};
  8.     char char2[] = "abcd";
  9.     const char *pChar3 = "abcd";
  10.     int *ptr1 = (int *)malloc(sizeof(int) * 4);
  11.     int *ptr2 = (int *)calloc(4, sizeof(int));
  12.     int *ptr3 = (int *)realloc(ptr2, sizeof(int) * 4);
  13.     free(ptr1);
  14.     free(ptr3);
  15. }
复制代码
        这段代码涉及了C/C++中步伐内存地区划分,假如可以清晰的知道每个变量和只读常量所在C/C++中步伐内存地区的位置阐明还是可以的。
        

        一样平常在函数内创建的变量都是在栈区的,假如是static变量不论在那创建都是在数据段(静态区),对于ptr1这样的用于指向动态开辟的内存空间的变量,他本身在出栈时会被开释,但是他所指向的空间并不会在出栈时被开释。
        阐明:
        1.栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
        2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用体系接口创建共享内存,做进程间通讯。
        3.堆用于步伐运行时动态内存分配,堆是向上生长的
        4.数据段--存储全局变量和静态数据
        5.代码段--可实行的代码/只读常量
2.C/C++中内存管理方式

2.1 C的内存管理方式


  1. void Test()
  2. {
  3.     int *p1 = (int *)malloc(sizeof(int));
  4.     free(p1);
  5.     int *p2 = (int *)calloc(4, sizeof(int));
  6.     int *p3 = (int *)realloc(p2, sizeof(int) * 10);
  7.     free(p3);
  8. }
复制代码
        你们可以思考一下上面这段这段代码中p2是否需要开释,实在是不需要开释的因为realloc对于p2会做修改让p2指向新空间的开始。realloc的扩容机制并不是追加而是寻找符合的空间将原数据拷贝到新空间,然后将原来的指针指向新开的空间。
2.2 C++内存管理的方式

        相对于C而言C++内存管理的接口就比力少了只有两个一个new一个delete,C++与C内存管理最大的差异在于C++的new假如是自界说范例会调用相应的构造函数,delete会调用自界说范例的析构函数。
  1. void Test()
  2. {
  3.     // 动态申请一个int类型的空间
  4.     int *ptr4 = new int;
  5.     // 动态申请一个int类型的空间并初始化为10
  6.     int *ptr5 = new int(10);
  7.     // 动态申请10个int类型的空间
  8.     int *ptr6 = new int[10];
  9.     delete ptr4;
  10.     delete ptr5;
  11.     delete[] ptr6;
  12. }
复制代码

        注意:申请和开释单个元素的空间,使用new和delete操作符,申请和开释一连的空间,使用new[]和delete[]一定要匹配起来用
3.operator new与operator delete函数

        new和delete是用户进行动态内存申请和开释的操作符,operator new和operator delete是体系提供的全局函数,new在底层调用oprator new全局函数来申请空间,delete在底层通过operator delete全局函数开释空间
  1. /*
  2. operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,
  3. 尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
  4. */
  5. void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
  6. {
  7.     // try to allocate size bytes
  8.     void *p;
  9.     while ((p = malloc(size)) == 0)
  10.         if (_callnewh(size) == 0)
  11.         {
  12.             // report no memory
  13.             // 如果申请内存失败了,这里会抛出bad_alloc 类型异常
  14.             static const std::bad_alloc nomem;
  15.             _RAISE(nomem);
  16.         }
  17.     return (p);
  18. }
  19. /*
  20. operator delete: 该函数最终是通过free来释放空间的
  21. */
  22. void operator delete(void *pUserData)
  23. {
  24.     _CrtMemBlockHeader *pHead;
  25.     RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
  26.     if (pUserData == NULL)
  27.         return;
  28.     _mlock(_HEAP_LOCK); /* block other threads */
  29.     __TRY
  30.     /* get a pointer to memory block header */
  31.     pHead = pHdr(pUserData);
  32.     /* verify block type */
  33.     _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
  34.     _free_dbg(pUserData, pHead->nBlockUse);
  35.     __FINALLY
  36.     _munlock(_HEAP_LOCK); /* release other threads */
  37.     __END_TRY_FINALLY
  38.     return;
  39. }
  40. /*
  41. free的实现
  42. */
  43. #define free(p) _free_dbg(p, _NORMAL_BLOCK)
复制代码
        通过上述两个全局函数的实现知道,operator new实际也是通过malloc来申请空间,假如malloc申请空间成功就直接返回,否则实行用户提供的空间不足应对措施,假如用户提供该措施就继续申请,否则就抛异常。operator delete终极是通过free来开释空间的。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表