一个C/C++程序内存分配形式

简介: 一:一个C/C++程序编译之后在内存中一般分为五个部分1. 程序代码区:程序代码区主要用来存放程序执行代码,包括类成员函数、全局函数、静态函数等其它函数的代码。


一:一个C/C++程序编译之后在内存中一般分为五个部分

1. 程序代码区:程序代码区主要用来存放程序执行代码,包括类成员函数、全局函数、静态函数等其它函数的代码。这部分内存区域的大小在程序运行前就已经确定了,并且内存通常是只读的。一般程序代码区是可以被共享的


2. 常量区:用来存放常量的内存区域,程序结束后由操作系统收回


3. 全局数据区(静态存储区):存放全局变量和静态变量,程序结束后由操作系统收回。

    全局变量、静态全局变量、静态局部变量都是在静态存储区分配空间的。


4. 堆区:堆用于存放程序运行中动态分配的内存段,它的大小不是固定的,可以动态的扩张和缩减。

    当进程调用new或malloc申请内存空间的时候,堆被扩张;当使用delete或free释放内存空间的时候,堆被缩减。

    堆一般由程序员手动分配和释放,如果没有释放则会在程序结束的时候由操作系统收回。

    堆的内存分配机制如下:操作系统有一个专门用来存储空闲内存地址的链表,链表每个结点表示一块空闲内存地址空间。当程序收到new或malloc申请时,就去查找这个链表直到找到一个结点的内存空间大于所申请的内存空间,将这个结点从链表中删除并将内存分配给程序,如果有剩余的内存空间则继续放入到链表中使用。

    堆区不是连续的内存空间因为系统用链表来存储空闲内存地址,堆的内存空间相对较大,在windows下堆申请的空间一般超过2G。


5. 栈区:栈区主要用来存储程序临时创建的局部变量,包括函数体内的局部变量、函数参数等。(但是不包括静态局部变量因为所有的静态变量存放在全局数据区)

   栈由编译器自动分配和释放,操作形式类似数据结构的栈,效率比较高,但是栈能够分配的大小是固定的一般比较小。  

   栈是一块连续的内存区域,栈顶的地址和栈的容量是预先规定好的,windows下栈的大小是2M。



二:堆区是由低地址向高地址生长,栈是由高地址向低地址生长

举例:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int global = 5; //全局数据区
static int value = 3; //全局数据区

int main(){
	int a; //栈区
	char str[] = "abc"; //str存放在栈区
	char *p = str; //栈区
	static int c = 0; //全局数据区
	char *p1;
	p1 = (char *)malloc(5*sizeof(char)); //堆区
	p1 = "1234"; //"1234"存放在常量区
	return 0;
}

三:内存泄露

1. 堆是动态分配内存的,可以分配比较大的内存空间,因此使用不好容易造成内存泄露和内存碎片

2. 内存泄露一般是指堆内存的泄露,指的是由于疏忽或错误造成程序未能释放已经不再使用的内存空间,造成这些内存空间不受控制造成内存浪费



目录
相关文章
|
7月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
251 26
|
12月前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
8月前
|
C语言 C++
c与c++的内存管理
再比如还有这样的分组: 这种分组是最正确的给出内存四个分区名字:栈区、堆区、全局区(俗话也叫静态变量区)、代码区(也叫代码段)(代码段又分很多种,比如常量区)当然也会看到别的定义如:两者都正确,记那个都选,我选择的是第一个。再比如还有这样的分组: 这种分组是最正确的答案分别是 C C C A A A A A D A B。
157 1
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
586 68
|
11月前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
NoSQL 测试技术
内存程序崩溃
【10月更文挑战第13天】
493 62
|
12月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
513 0
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
525 1
|
存储 程序员 编译器
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
622 0
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
279 3