C++中内存申请

C++中内存申请,第1张

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标准库函数,二者除了申请内存都在堆上申请外,必须同时结对使用外,还是有很多不同的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存