• c++程序内存区域划分


    目录

    内存区域划分 

    例题:

     malloc,calloc和realloc的区别

    new和delete

     申请空间并初始化

    申请多个空间:

    new和delete对于自定义类型的处理:

     new和delete一定要匹配

    new和malloc以及delete和free的区别

     抛异常的使用方法:

     new的底层


    内存区域划分 

     

    注意:我们编写的代码是存在于计算机文件当中的,计算机文件属于硬盘而不属于内存,所以代码并不属于以上的内存划分 

    例题:

     

    我们对char2和*char2以及pChar3和*pChar3进行理解:

     

    char2的字符串是经过静态区的"abcd"进行拷贝拷贝到栈上去。

    pChar3因为被const修饰,所以对应的字符串在常量区,pChar3指向该区域。

    char2和pChar3都是在栈上创建的指针,属于栈。

    *char2表示数组首元素,也就是'a'

    *pChar3表示指向常量区的常量字符串"abcd"的地址。

     malloc,calloc和realloc的区别

    malloc表示申请空间,calloc表示申请空间并且初始化,而realloc表示扩容或缩容。 

    这里不需要对ptr2进行释放:

    答:在使用realloc时,会分为原地扩容或异地扩容,原地扩容之后ptr3就是原来的ptr2,异地扩容时,realloc函数还会将ptr2指向的空间进行释放。

    new和delete

    new和delete类比c语言的malloc和free,起到申请空间和释放空间的作用。

    1. int main()
    2. {
    3. int*p = new int;
    4. delete p;
    5. }

    申请一个整型的空间,p指针指向该空间。

    delete表示释放该空间。

    我们在new的时候,并不会对该空间进行初始化。

     申请空间并初始化

    1. int main()
    2. {
    3. int*p = new int(0);
    4. delete p;
    5. return 0;
    6. }

    表示申请空间并把该空间对应的值初始化为0.

    申请多个空间:

    1. int*p1 = new int[10];
    2. delete[] p1;

    申请多个空间并且初始化:

    1. int*p1 = new int[10]{1, 2, 3, 4};
    2. delete[] p1;

    new和delete对于内置类型的处理,和malloc,free没有什么区别。

    new和delete对于自定义类型的处理:

    1. class A
    2. {
    3. public:
    4. A(int a = 0)
    5. :_a(a)
    6. {
    7. cout << "A():" << this << endl;
    8. }
    9. ~A()
    10. {
    11. cout << "~A():" << this << endl;
    12. }
    13. private:
    14. int _a;
    15. };
    1. class A
    2. {
    3. public:
    4. A(int a = 0)
    5. :_a(a)
    6. {
    7. cout << "A()" << this << endl;
    8. }
    9. ~A()
    10. {
    11. cout << "~A():" << this << endl;
    12. }
    13. private:
    14. int _a;
    15. };
    16. int main()
    17. {
    18. /*int*p = new int(0);
    19. delete p;*/
    20. /*int* p1 = new int[10]{1,2,3,4,5,6,7,8,9,10};
    21. delete[] p1;*/
    22. A*p1 = new A;
    23. delete p1;
    24. return 0;
    25. }

    对于自定义类型,new可以调用其默认构造,delete可以调用其默认析构。

     new和delete一定要匹配

    错配可能产生我问题。

    new和malloc以及delete和free的区别

    1. int main()
    2. {
    3. while (1)
    4. {
    5. int*p1 = (int*)malloc(1024);
    6. if (p1)
    7. {
    8. cout << p1 << endl;
    9. }
    10. else
    11. {
    12. cout << "申请失败" << endl;
    13. break;
    14. }
    15. }
    16. }

    malloc不断的申请内存,最终会申请失败,申请成功时返回该指针,申请失败时返回空指针。

     当我们使用new来进行替代时:

    1. int main()
    2. {
    3. while (1)
    4. {
    5. int*p1 = new int[102400];
    6. if (p1)
    7. {
    8. cout << p1 << endl;
    9. }
    10. else
    11. {
    12. cout << "申请失败" << endl;
    13. break;
    14. }
    15. }
    16. }

    我们发现:new成功时返回该指针,new失败时不返回空指针。

     总结:malloc申请成功,返回该指针,申请失败,返回空指针。

    new申请成功,返回该指针,申请失败,抛异常。

     

    1. int main()
    2. {
    3. try{
    4. while (1)
    5. {
    6. int*p1 = new int[102400];
    7. if (p1)
    8. {
    9. cout << p1 << endl;
    10. }
    11. else
    12. {
    13. cout << "申请失败" << endl;
    14. break;
    15. }
    16. }
    17. }
    18. catch (exception& e)
    19. {
    20. cout << e.what() << endl;
    21. }
    22. return 0;
    23. }

     抛异常的使用方法:

    1. void test()
    2. {
    3. while (1)
    4. {
    5. int*p1 = new int[102400];
    6. if (p1)
    7. {
    8. cout << p1 << endl;
    9. }
    10. else
    11. {
    12. cout << "申请失败" << endl;
    13. break;
    14. }
    15. }
    16. }
    17. int main()
    18. {
    19. try{
    20. test();
    21. }
    22. catch (exception& e)
    23. {
    24. cout << e.what() << endl;
    25. }
    26. }

    申请失败是自动去抛异常。

     new的底层

    总结:

    注意:并不是运算符重载,因为没有自定义类型的参数。

     

    new就相当于是malloc的封装,不同点在于申请内存失败时抛异常。

     对于operator new的使用:

    1. #include
    2. using namespace std;
    3. void test()
    4. {
    5. while (1)
    6. {
    7. int*p1 = (int*)operator new(102400);
    8. if (p1)
    9. {
    10. cout << p1 << endl;
    11. }
    12. else
    13. {
    14. cout << "申请失败" << endl;
    15. break;
    16. }
    17. }
    18. }
    19. int main()
    20. {
    21. try{
    22. test();
    23. }
    24. catch (exception& e)
    25. {
    26. cout << e.what() << endl;
    27. }
    28. }

    operator new的使用方法和malloc类似。

  • 相关阅读:
    LeetCode--179. 最大数(C++描述)
    java hashmap 单词计数
    尚硅谷ES6复习总结下(65th)
    Linux fork函数详解
    35岁危机来临前,程序员如何未雨绸缪?
    AR编程入门:解锁虚拟与现实交融的新世界
    JUnit测试进阶(Mock测试)
    使用systemd部署r-nacos
    Ubuntu18.04 ros 安装ZED SDK---基于x86架构
    精品基于Uniapp+SSM实现的Android的餐饮管理系统
  • 原文地址:https://blog.csdn.net/qq_66581313/article/details/133185356