栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++中内存申请

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++中内存申请

C++中内存申请 内存分配三个区域

目前看到资料说,C++内存分配分为三种方式,在静态存储区分配,在栈上分配,在堆上分配,这三者的不同首先在存储变量的生命周期不同,静态存储区存放静态变量和全局变量,在程序运行过程中一直存在,而栈上的属于编译器自动申请的,分为静态分配和动态分配,属于系统自动分配和回收的,生命周期不受控制。而堆上的是动态分配,属于程序员可控制生命周期的变量,需要手动释放,不然会造成内存泄漏。

那么如果声明了一个vector,怎么知道它是如何分配的内存呢?按上述说法,它分配的地点其实不确定,如果是局部变量,那么就分配在了栈上,如果是全局变量,就分配到了静态区,如果是程序员手动声明在堆上,那么就是分配在堆上了(听君一席话,如听一席话)。

内存申请函数(c标准库函数)

我们知道,内存申请在C++里有如下几个函数,malloc(unsigned int n),calloc(n,s),realloc(m,new_size),_alloc();这几个内存分配函数,第一个是在堆上申请内存,其原理是维护一个内存空闲链表,分配时给你一个空闲大小和申请大小最接近的地址,当然,返回的是不确定类型的指针void*,需要转换位确定类型指针,如果没有空闲内存,则返回空指针。该函数调用后需要手动调用free函数释放内存,不然会造成内存泄漏,另外频繁调用该方法获取大小不一的内存会造成内存零散化。

calloc(n,s)申请n份大小为s的内存,并且会初始化这部分内存,感觉比malloc()高级些,这个内存申请后应该也要手动释放。

realloc(m,new_size)是找一块new_size大小的内存,然后把m内容拷贝过去,返回新内存地址,但如果原来地址后面有足够的内存,好像是直接扩展就行。

_alloc()就是编译器自动调用的内存申请函数,自动释放内存,不需要手动释放。

程序中数据存储区

程序内有五个数据区

1.静态存储区,内存大小已分配好,固定大小

2.栈区,编译器申请

3.堆区,手动动态申请区,需要手动释放

4.字符串常量区,程序可以理解为除非数字就是字符串,字符串常量就存在这里

5.程序数据区,估计是放源代码和库的区域

由哪种方式分配的内存?

回到最开始的问题,如果声明一个变量,怎么知道它是用哪种方式申请的内存呢?

目前来看,首先看这个变量声明的位置,如果是局部变量,并且没有使用new关键字来声明,那么就是_alloc()在栈上申请,如果使用new,则是在堆上申请,那么必须手动释放内存。

另外,new和delete属于c++关键字,除了自动申请内存,还会调用对象的构造函数和析构函数,而malloc()和free()是c标准库函数,二者除了申请内存都在堆上申请外,必须同时结对使用外,还是有很多不同的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/886920.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号