动态内存管理了解一下?

我就是我 2022-05-28 12:06 383阅读 0赞

一、C语言中的malloc、calloc、realloc

  • C语言中malloc是用来分配内存的。

201804041952567

malloc返回一个指向所分配空间的空指针,或者如果没有足够的内存空间就返回NULL,参数num是要开辟的字节数。

  • calloc在内存中分配一个数组,并初始化为0。

20180405152455792

calloc返回一个指向所开辟空间的指针,开辟不成功返回NULL参数num是元素的个数,size是各元素的字节数。

  • relloc重新分配内存

20180405154033829

  1. 判断当前指针是否有足够大的连续空间,如果有,扩大memblock指向的位置并返回memblock,如果空间不够按照size指定的大小重新分配空间,将原有的数据从头到尾拷贝到新的内存中,释放旧的内存同时返回新内存的地址。参数memblock是指向之前内存的指针,size是分配后新的字节数。

二、C++中的new和delete。

面向过程的C++在动态内存管理中所使用的new和delete与malloc和free的区别

1.new和delete都是操作符,malloc和free是库函数,所以new和delete可以重载。

2.new和delete在调用时会自动调用构造函数和析构函数进行初始化和清理。

  1. #pragma once
  2. #include <iostream>
  3. using namespace std;
  4. class Array
  5. {
  6. public:
  7. Array(int size = 10)
  8. :_size(size)
  9. ,_str(0)
  10. {
  11. cout<<"call constructor"<<endl;
  12. if(size>0)
  13. {
  14. _str = new int[size];
  15. }
  16. }
  17. ~Array()
  18. {
  19. cout<<"called destructor"<<endl;
  20. if(_str)
  21. {
  22. delete[] _str;
  23. _str = 0;
  24. _size = 0;
  25. }
  26. }
  27. void Show()
  28. {
  29. cout<<"size = "<<_size<<endl;
  30. cout<<"_str= "<<_str<<endl;
  31. }
  32. private:
  33. int *_str;
  34. int _size;//数组的大小
  35. };
  36. #include "new.h"
  37. #include <stdio.h>
  38. void Test()
  39. {
  40. printf("===========p1==========\n");
  41. Array *p1 = (Array *)malloc(sizeof(Array));
  42. printf("===========p2==========\n");
  43. Array *p2 = new Array(20);
  44. p2->Show();
  45. printf("===========p3==========\n");
  46. Array *p3 = new Array[10];
  47. p3->Show();
  48. free(p1);
  49. delete p2;
  50. delete []p3;
  51. }
  52. int main()
  53. {
  54. Test();
  55. system("pause");
  56. return 0;
  57. }

p2使用new开辟大小为20的数组,调用一次构造函数一次析构函数;p3使用new开辟了10个大小为10的数组(不写数组大小默认为10)调用10次构造函数10次析构函数。

2018040716440095

3.malloc库函数中有参数size故在使用时必须手动计算元素的大小,new则不用。malloc失败返回NULL,new失败会抛异常;malloc成功返回void * 类型,new成功返回自己对应类型的指针。

三、new/delete和new[]/delete[]

20180407143633385

new实现内存的动态管理是用operator new重载实现的;其实最后开辟空间还是使用了malloc函数。

20180407143619853

operator new[]中使用了operator new。此时注意count是84!

20180407145430831

delete使用free释放空间。

2018040714584564

用operator delete[]重载了delete[]。operator delete[]中使用operator delete。

new一次传的size是8,new[]的应该是8*10 = 80,但是却多开辟了4个字节的空间。这是因为delete[]p3时并没有给的delete传需要调用几次析构函数,析构函数显式定义时才会多开辟。

在new.h中增加内置类型int *p4和int *p5[]

  1. #include "new.h"
  2. #include <stdio.h>
  3. void Test()
  4. {
  5. printf("===========p1==========\n");
  6. Array *p1 = (Array *)malloc(sizeof(Array));
  7. printf("===========p2==========\n");
  8. Array *p2 = new Array(20);
  9. p2->Show();
  10. printf("===========p3==========\n");
  11. Array *p3 = new Array[10];
  12. p3->Show();
  13. free(p1);
  14. printf("===========p4==========\n");
  15. int*p4 = new int;
  16. delete p4;
  17. printf("===========p5==========\n");
  18. int *p5 = new int[10];
  19. delete p5;
  20. delete p2;
  21. delete []p3;
  22. }
  23. int main()
  24. {
  25. Test();
  26. system("pause");
  27. return 0;
  28. }

查看count的大小

20180407152255422

内置类型没有显式定义析构函数故count还是4 * 10 = 40。

画图表示如下:

201804071654202

发表评论

表情:
评论列表 (有 0 条评论,383人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态内存管理

    大家好,我今天为大家分享的是动态内存管理相关的知识,后续也会运用动态内存管理的相关知识优化我前面写的[静态版通讯录][Link 1]。那么就由我来带大家走进今天的学习吧。 首