深喉咙企业网站模板网络推广外包业务怎么样
前言
C++相对于其他语言有一个重要的特点就是对于内存的管理,相比于C语言,C++提供了新的关键字new来代替malloc的功能,其中有何不同,请看下文。
一、内存的构成
在我们日常编程过程中最常接触到的就是以下四个分区
以下将分别给出例子说明每个分区对应存储的内容。
#include <iostream>
using namespace std;int global;
static int stc_global;void func(){int func_val;static int stc_func_val;
}int main(){func();int val;static int val;char arr[] = "abc";char* cptr = "abc";int*ptr = new int;return 0;
}
分析:
**global: **作为全局变量,存放于数据段;
**stc_global: **全局变量,且为静态变量,存放于数据段;
**func_val: **由函数调用产生的临时变量,存放于栈;
**stc_func_val: **临时变量,但是由 static 修饰,因此存放于数据段;
**val: **主函数中创建的临时变量,存放于栈;
**stc_val: **临时变量,但由static修饰,因此存放于数据段;
**arr: **主函数中直接创建的数组,存放于栈;
***arr: **对数组解引用,得到数组第一个元素的首地址,虽然 ”abc“ 是一个常量字符串,但是在此处是将其常量值拷贝到了栈,因此本质还是栈区;
**cptr: **主函数中创建的指针变量,存放于栈区;
***cptr: **与 *arr 不同之处在于,cptr是一个指针变量,直接指向了常量字符串 ”abc" , 而常量字符串作为只读常量,存放于代码段,因此 *cptr 存放于代码段;
**ptr: ** 主函数中创建的指针变量,存放于栈区;
***ptr: **new关键字其功效类似于 C语言中的 malloc 函数,因此 *ptr指向的内容属于堆区;
其中最容易混淆的就是指针变量,许多同学看到 new、malloc 等字就盲目认为存放于堆区,但是关键在于是其中开辟的空间属于堆区,而存放该空间地址的指针变量还是属于栈区
二、C语言和 C++对于内存管理的函数
万物的诞生必有其道理。C语言的内存管理函数为 malloc 和 free,为什么到了 C++就不在适用,反而诞生了 new 和 delete 关键字。其关键在于 C++ 多出的面向对象的概念,下面将从其不同讲述其区别。
2.1 类型不同
在 C语言中,malloc 和 free 作为函数使用,因此在使用时就必须包含对应的头文件;
在 C++ 中,new 和 delete 则作为关键字使用,因此不需要包含头文件即可使用;
2.2 功能不同
前面提到 C++ 之所以诞生出 new 关键字很大一部原因在于面向对象概念的提出。
new 相比于 malloc 最大的提升也在于 new 会调用所创建类型的构造函数,这一点在平时创建 int,char等内置类型时体现的不明显,但是对于一个自写的类,就显得尤为重要。同样的,delete 则会调用类的析构函数,这使得面向对象得以更好的实现。
2.3 失败后返回值不同
这一点在前期不用过多了解,我们只需要知道 C语言在调用 malloc 函数分配空间失败时,会返会一个空的指针,但是在 C++ 中 new 分配空间失败时,则会抛出一个异常,可以用 try—catch 捕获。