C与C++申请动态内存空间的异同

C与C++申请动态内存空间的异同

C语言与C++的关系,我们可以这样来形容,C++继承于C语言,却两者都有各自独特的特性,比如在如何申请动态内存空间上有显著的差别。

首先我们要知道,为什么需要动态申请内存空间?

与动态分配相对应的是静态分配,在计算机中,内存分为栈区和堆区,其中栈区的空间相对于堆区会小很多,可以理解为,自己的家和仓库。

静态分配是在栈区提前分配一个固定大小的空间,而动态分配是需要多少分配多少,需要注意的是,动态分配需要程序员维护内存。

说了大致的分别,现在我们来看C语言和C++动态分配内存空间的区别:

下面是C语言动态分配方式的样式代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 int main(){
 4     int *p;
 5     p = (int*)malloc(sizeof(int));
 6     *p = 4;
 7     printf("%d\n",*p);
 8     free(p);
 9     return 0;
10 }

C语言动态分配内存需要一个名叫malloc() 函数,以及free()函数用来释放内存,这两个函数需要导入头文件"stdlib.h"。

malloc函数默认为void*类型,它的参数为申请空间的大小,malloc函数如果需要返回地址,则需要强转为指定类型,在上面代码中,需与指针p类型相匹配,则用(int*)强转,

free函数释放内存。它的参数为需要释放空间的指针。注意:一定要释放内存,不然会造成空间浪费。

下面是C++动态分配内存的样式代码:

 1 #include <iostream>
 2 using namespace std;
 3 int main(){
 4     int *p1  = new int;
 5     *p1 = 4;
 6     cout<<*p1<<endl;
 7
 8     int *p = new int[3];
 9     p[0] = 1;
10     p[1]=2;
11     p[2] = 3;
12     p[3] = 4;
13     cout<<p[0]<<" "<<p[1]<<" "<<p[2]<<" "<<p[3]<<endl;
14
15     delete p1;
16     delete []p;
17     return 0;
18 }

C++的动态内存分配不需要导入头文件,它具有new 和delete两个关键字用来行使这个功能,上述代码强调了常量与数组的区别,最大的区别在于释放内存的方式,C++分配内存的方式的优势在于,它不再需要计算数据类型的大小,也就是不需要再使用sizeof函数,相对来说,要方便一些。

好了,以上就是今天所说的,C语言与C++之间动态分配内存方式的分别,希望对大家有一点点帮助。

如有错误,请指出,一定加以改正。

原文地址:https://www.cnblogs.com/whtmomo/p/11334494.html

时间: 2024-11-04 11:15:24

C与C++申请动态内存空间的异同的相关文章

PostgreSQL 聚合函数共享申请的内存空间

CREATE AGGREGATE Rbitmap_union2 (Rbitmap) ( sfunc = myfunction, stype = mytype, FINALFUNC = myfunction_final ); 在编写聚合函数时,对每一行都会重复调用指定同一函数,如果要处理的数据是累加的,那么如果不在每次调用之间共享内存空间,而是不停的申请释放新的内存,那么速度会变得很慢,所以在这时共享内存是十分有用的: PostgreSQL 有 MemoryContext 的概念,如果普通的使用

动态内存空间的开辟与释放

在不知道需要占用内存空间大小时,需要在堆栈上动态开辟内存空间,空间使用结束后需要程序员自己释放. #include <stdio.h> #include <stdlib.h> void main() { int n,*p,i,j,m,temp; printf("本程序可对任意个整数排序;\n"); printf("请输入整数的总个数: "); scanf("%d",&n); p=(int *)calloc(n,si

C++不能在栈上申请动态内存,而只能依靠指针

以下三种情况皆错,都编译不过: int main(int argc, char* argv[]) { int a; int b[a]; } int main(int argc, char* argv[]) { int a=4; int b[a]; } int main(int argc, char* argv[]) { int a; cin >> a; int b[a]; }

动态内存管理---new&amp;delete

动态内存管理 动态对象(堆对象)是程序在运行过程中在动态内存中用new运算符创建的对象. 由于是用户自己用new运算符创建的,因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. 计算机内存数据区常有三种分区,即静态数据区.堆区.桟区. 1.程序在编译时就为静态变量和静态对象分配了静态数据存储区.在静态数据区中存储的变量或对象在该程序的整个运行期间都存在, 它们的生命周期贯穿整个程序的运行周期.比如全局变量.static(静态)变量等都是存储在静态数据区. 2.调用函数时,函

动态内存管理---new&amp;amp;delete

动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. 计算机内存数据区常有三种分区.即静态数据区.堆区.桟区. 1.程序在编译时就为静态变量和静态对象分配了静态数据存储区.在静态数据区中存储的变量或对象在该程序的整个执行期间都存在. 它们的生命周期贯穿整个程序的执行周期.比方全局变量.static(静态)变量等都是存储在静态数据区. 2.调用函数时.函

12、内存空间的申请

1.用户空间内存的申请     用户空间内存的申请函数为 malloc,相对应的内存释放函数为 free.malloc 函数具备一下的内存能力 (1)二次管理的的能力     当用户空间 malloc 了一块内存,这块被申请的内存被立即 free 之后,并不会立即将这块内存还给内核,而是将这块内存还给了 C 库,这块内存还是属于这个进程,只是将这块内存交给 C 库去进行管理.因此后续的内存申请,就可以占用这块被释放的内存了. (2)Linux 内核总是按需分配     当 malloc 成功之后

内存分配的几种方式,以及动态内存传递的注意事项

一.内存的分配方式?静态存储区,栈,堆 静态存储区:内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在,比如说全局变量. 栈:在栈上创建,在函数执行期间,函数内部局部变量和形参可以在栈上创建,函数执行这些存储单元自动释放.所以我们不能返回在函数内部定义的变量(函数定义的指针可以返回),因为他们在函数执行结束时已经被销毁了,处理器的指令集有关于站内部的分配运算,因此效率很高,但是分配的内存资源有限. 堆:从堆上分配,也称为动态内存分配,使用new malloc等申请任意多内存,程序

2015.12.14 宏定义 枚举 动态内存分配

宏定义 (#define) 宏定义的意义和用途:(习惯上,都是“k”开头) 1.为了让一些数据有意义. 2.类似于内联函数(使用简便). 3.输出日志的开关. (非零即真,0为“发布阶段”,1为“开发阶段”) 枚举 (enum) 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 默认情况下,枚举中每个元素的基础类型是 int.可以使用冒号指定另一种整数值类型.默认是从0开始,后者会在前者之上+1. 动态内

FreeRTOS 动态内存管理

本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面章节讲解的任务创建. 信号量. 消息队列. 事件标志组. 互斥信号量. 软件定时器组等需要的 RAM 空间都是通过动态内存管理从 FreeRTOSConfig.h 文件定义的 heap 空间中申请的. 动态内存管理介绍FreeRTOS 支持 5 种动态内存管理方案,分别通过文件 heap_1,heap_2,heap_3,heap_4 和 heap_5实现,这 5 个文件在 FreeRTOS