C/C++的内存管理你了解嘛

 更新时间:2022年01月24日 11:49:08   作者:Bitdancing  
这篇文章主要为大家介绍了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";
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在哪里?__A__   *char2在哪里?_A__
  pChar3在哪里?_A___   *pChar3在哪里?__D__
  ptr1在哪里?__A__    *ptr1在哪里?__B__

2. 填空题:(32位程序)
  sizeof(num1) = __40__;  
  sizeof(char2) = __5__;   strlen(char2) = __4__;
  sizeof(pChar3) = __4__;   strlen(pChar3) = __4__;
  sizeof(ptr1) = __4__;

在这里插入图片描述

1.堆又叫堆栈,非静态局部变量、函数参数、返回值等等,栈是向下增长的。

2.内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享内存,做进程间通信。

3.堆用于程序运行时动态内存分配,堆是可以向上增长的。

4.数据段 – 存储全局数据和静态数据。

5.代码段 – 可执行的代码/只读常量 

C语言中动态内存管理方式

malloc, calloc, realloc 的区别?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

calloc 会初始化, 相当于 malloc + memset, 按字节初始化,空间每个字节都初始化为0。
realloc扩容,分为原地扩,异地扩。

C++ 内存管理方式

申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]。

int* p1 = new int(5); 

动态申请一个int空间,这块空间初始化为5.

int* p2 = new int[5];

动态申请5个int空间。

int* p3 = new int[5]{1,2,3,4,5};

给上初始值

new和delete操作自定义类型

在申请自定义类型的空间时,new 会调用构造函数, delete 会调用析构函数,而 malloc 与 free 不会。

operator new 与 operator delete函数

new 和 delete 是用户进行 动态内存申请 和释放的操作符, operator new 和 operator delete 是系统提供的全局函数。
new 在底层调用operator new全局函数来申请空间,delete 在底层通过operator delete全局函数来释放空间。

  • operator new :该函数通过 malloc 来申请空间,当 malloc 申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则就行申请,否则 跑异常。
  • operator delete:该函数最终是通过free来释放空间的。 

new和delete的实现原理

1.内置类型

如果申请的是内置类型的空间, new 和 malloc, deletefree基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间。

new[] 和 delete[] 申请的是连续空间,而且new在申请空间失败时会抛异常, malloc 会返回 NULL

2.自定义类型

  • new原理

1.调用 operator new 函数申请空间

2.在申请的空间上执行构造函数,完成对象的构造。 

  • delete的原理

1.在空间上执行析构函数,完成对象中资源的清理工作。

2.调用 operator delete 函数释放对象的空间。

  •  new T[N]的原理

1.调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请

2.在申请的空间上执行N次构造函数 

  • delete[]的原理

1.在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理

2.调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间 

malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。

不同的地方是:

1.malloc和free是函数,new和delete是操作符

2.malloc申请的空间不会初始化,new可以初始化

3.malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可

4.malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

5.malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

6.申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++11中列表初始化机制的概念与实例详解

    C++11中列表初始化机制的概念与实例详解

    在我们实际编程中,我们经常会碰到变量初始化的问题,对于不同的变量初始化的手段多种多样,下面这篇文章主要给大家介绍了关于C++11中列表初始化机制的相关资料,需要的朋友可以参考下
    2021-11-11
  • C++ 轻量级对象JSON序列化实现详情

    C++ 轻量级对象JSON序列化实现详情

    本文以jsoncpp库为基础,设计这样一个可以支持一个函数 可以一行代码 unmarshal /marshal 对象,需要的朋友小伙伴可以参考以下
    2021-09-09
  • C++有符号和无符号之间的转换问题

    C++有符号和无符号之间的转换问题

    在开发中经常会遇到有符号和无符号之间的转换问题,如果不清楚问题根源,很难解决bug,今天小编通过本文给大家分享c++有符号无符号转换问题,需要的朋友参考下
    2021-07-07
  • 数据结构顺序表操作示例

    数据结构顺序表操作示例

    这篇文章主要介绍了数据结构顺序表操作示例,其中有在第I个元素前插入数据x,元素从0开始计数、删除第i个元素,元素从0开始计数的方法,需要的朋友可以参考下
    2014-03-03
  • 一篇文章带你了解C语言二分查找

    一篇文章带你了解C语言二分查找

    这篇文章主要为大家详细介绍了C语言二分查找法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Qt+QWidget实现简约美观的加载动画

    Qt+QWidget实现简约美观的加载动画

    这篇文章主要为大家详细介绍了Qt如何结合QWidget实现简约美观的加载动画,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C语言之字符串模糊查询方法的实现

    C语言之字符串模糊查询方法的实现

    本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
    2015-07-07
  • C++示例分析内联函数与引用变量及函数重载的使用

    C++示例分析内联函数与引用变量及函数重载的使用

    为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数
    2022-08-08
  • 老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)

    老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)

    下面小编就为大家带来一篇老生常谈C++的单例模式与线程安全单例模式(懒汉/饿汉)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++实现字符串删除字符后逆序输出

    C++实现字符串删除字符后逆序输出

    这篇文章主要为大家详细介绍了C++实现字符串删除字符后逆序输出,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论