小工具知识网

当前位置: 首页 > 行业知识 > C++内存管理

行业知识

C++内存管理

2026-11-09 05:27:09 来源:互联网转载

���录

一、内存的划分 

1.各个内存区域

2.小练习

二、C++的动态内存管理

1.new和delete的引入

2.new和delete的使用

3.内存泄漏

三、深入了解new和delete关键字

1.operator new与operator delete函数

2.定位new(了解)


一、内存的划分 

1.各个内存区域

程序的运行需要内存,对于我们以前常用的32位操作系统,指针变量的大小为四字节,地址个数一共有2的32次方个,每一个字节加起来就是4G;而对于我们现在常用的64位操作系统,指针变量的大小为八字节,地址个数一共有2的64次方个,每一个字节加起来理论上是17179869184G,也就是16777216T,但是我们现在使用的电脑普遍是8G或者16G内存,所以内存空间对于地址的利用并不完全。

我们为了有效地使用内存,避免程序读写遇到空间上的冲突。就需要将内存划分为不同的区域,主要包括:内核空间、栈、堆、内存映射段、数据段、代码段。

  • 内核空间:类似于之前Linux讲的内核kernel,这是操作系统工作的空间我们一般人不能操作
  • 栈:栈又叫堆栈,栈区中主要存放函数的返回值/函数的参数/非静态的成员变量,栈的特点是向下增长的(从栈申请的内存地址会越来越小)。
  • 内存映射段:是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
  • 堆区:主要要用于程序的动态开辟,堆的特点是向上增长的。
  • 数据段:存放全局变量和静态变量。
  • 代码段:存储可执行文件的指令(定义过的函数等)和只读常量。

    注意这里格子的大小不代表每个区域空间的大小。

    2.小练习

    根据下图中的代码选择数据的储存位置

    (1)选择题:

      选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

      globalVar在哪里?____  staticGlobalVar在哪里?____

      staticVar在哪里?____  localVar在哪里?____

      num1 在哪里?____

      char2在哪里?____   *char2在哪里?___

      pChar3在哪里?____   *pChar3在哪里?____

      ptr1在哪里?____    *ptr1在哪里?____

    (2)填空题:

      sizeof(num1) = ____;  

      sizeof(char2) = ____;   strlen(char2) = ____;

      sizeof(pChar3) = ____;   strlen(pChar3) = ____;

      sizeof(ptr1) = ____;

    选择题答案:

      选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)

      globalVar在哪里?C(全局变量)  staticGlobalVar在哪里?C(静态变量)

      staticVar在哪里?C(静态变量)  localVar在哪里?A(局部变量)

      num1 在哪里?A(数组名是首元素地址,也在栈区)

      char2在哪里?A(数组名是首元素地址,也在栈区)  *char2在哪里?A(数组内容储存在栈区)

      pChar3在哪里?A(地址储存在栈区)   *pChar3在哪里?D(abcd是一个常量字符串,pChar3指向代码段内的这个常量字符串)

      ptr1在哪里?A (地址储存在栈区)   *ptr1在哪里?B(内容在堆区)

    填空题答案:

      sizeof(num1) = 40;  (整个数组大小)

      sizeof(char2) = 5(还有一个\0);   strlen(char2) = 4;(不包含\0)

      sizeof(pChar3) = 4/8;(指针都是4/8字节)  strlen(pChar3) = 4;(不包含\0)

      sizeof(ptr1) = 4/8;(指针都是4/8字节)二、C++的内存管理方式

    二、C++的动态内存管理

    1.new和delete的引入

    在C语言中,我们主要用malloc、calloc、realloc三个函数开辟堆区空间,用free释放空间。

    在C++中又引入了new和delete进行内存开辟与释放。

    #includeusing namespace std;int main(){    int* p1 = (int*)malloc(sizeof(int));    free(p1);    int* p2 = new int;    delete p2;    return 0;}

    上下两行代码起到的作用是一样的,上下都是开辟int类型大小的空间用p1和p2指针维护,然后释放空间。

    2.new和delete的使用

    new和delete的使用对于内置类型其实没有太多的优化,主要对于类类型申请空间更加方便。

    #includeusing namespace std;class Date{public:    Date(int year = 2000, int month = 1, int day = 1)        :_year(year)        , _month(month)        , _day(day)    {}    void Dateprint()    {        cout 

上一篇:怎么修改APP的服务器数据?

下一篇:ps怎么连接育碧服务器?