文档章节

c++ 内存分配

刘大神
 刘大神
发布于 2016/03/20 11:33
字数 786
阅读 21
收藏 0

1.内存分配介绍

在c++中,内存分成5个区,分别是 堆,栈,自由存储区,全局/静态存储区和常量存储区

栈,函数内局部比那里的存储单元都可以在栈上面创建,栈内存奉陪运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限;

堆,就是那些有new分配出来的内存块,每一个new对应一个delete,如果程序员忘记释放掉,那么程序结束之后,由操作系统自动收回(注:内存泄漏);

自由存储区,就是那些由malloc等分配的内存块,与堆相似,但有些不同,malloc对应free,自由存储区一般用来存储c方式的内存;

全局/静态存储区,顾名思义,这部分区域是用来存储全局变量和静态变量的;

常量存储区,这是一块比较特殊的存储区,他们里面存储的是常量,不允许被修改

2.常见的内存错误

*内存分配未成功,却使用了它。这种问题经常出在新手身上,因为他们没有意识到,内存会分配不成功,常见的解决办法就是在使用内存之前判断指针是否为空

*内存分配成功,但未初始化就使用了它。这种问题可能是没有初始化的概念,或者是认为内存的默认值全为0,常见的解决方法就是 初始化

*忘记释放内存,造成内存泄漏。动态内存申请和释放的时候必须配对,malloc对free    new对delete

*内存已分配,并且初始化,但是下标越界。这种情况经常会出现在,数组使用上面。常见的解决方法是使用stl

*内存已经释放,但是还再继续使用。这种问题可能是调用关系复杂,以至于难以发现是否已经释放了内存;或者是return语句指向了 已经释放的指针或者引用,亦或是释放内存后,没有置NULL,造成野指针

3.简单的内存管理和垃圾回收机制

在c++中,有2种比较简单的内存管理方式,一种是使用智能指针,另外一种是使用内存池。

*智能指针,通常是指引用技术型的智慧指针(auto_ptr除外),将一个计数器与指向的对象相关联,引用计数跟踪该类有多少个对象的指针指向同一对象

*内存池,内存池是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。这样做的一个显著优点是,使得内存分配效率得到提升,也在一定程度上,解决内存碎片的问题

© 著作权归作者所有

刘大神
粉丝 8
博文 21
码字总数 18133
作品 0
朝阳
高级程序员
私信 提问
内存泄露:a CDynLinkLibrary object at...的解决

这两天在设计一个项目,独立了几个DLL模块。昨天勉强把前段工作做完了,需要的DLL也都挂进了EXE文件之中,暗自高兴了一把。不过晚上在看的时候,发现VS2005输出窗口提示有内存泄露: a CDyn...

郭廷钧
2011/01/29
0
0
浅谈MFC内存泄露检测及内存越界访问保护机制

本文所有代码均在VC2008下编译、调试。如果您使用的编译器不同,结果可能会有差别,但本文讲述的原理对于大部分编译器应该是相似的。对于本文的标题,实在不知道用什么表示更恰当,因为本文不...

songchang
2012/09/28
0
0
有人要我挑战STL 质量, 很简单.

我很多年没有碰C++了, 下面是10年前的代码, 模板来做到数据类型无关, 用于在多个进程当中实现循环链表,用于消息队列. 新的版本,用一个局部对象,来实现锁. 实现这个的目的是在于通过设置固定大...

宏哥
2012/10/12
9.8K
132
C# vs C++之二:GC vs RAII

C# vs C++之二:GC vs RAII 资源管理 C中资源管理极为繁琐易错,大多复杂C系统都面临内存泄露、悬挂指针等问题 一方面由底层语言特点决定;另一方面也由于C语言特性相对较少,严重依赖程序员...

ddatsh
2011/06/28
1K
6
int *pi = new(std::nothrow) int 的用法

我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果...

天王盖地虎626
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

日期时间命令date

命令date 用途:打印或设置系统日期和时间 语法:date [选项]... [+格式] 选项: -s, --set=STRING 根据 STRING 设置时间 -u, --utc, --universal 显示或设置全球时...

迷失De挣扎
47分钟前
2
0
小白讲网络安全系列

注入攻击防护 XSS注入 SQL注入 命令注入 文件上传 文件解压缩 CSRF防护 对称加密 非对称加密 数字证书 数字签名 完整性校验 消息验证码 单向散列Hash函数 口令单向加密算法 审计日志 认证鉴权...

一刀
今天
2
0
MYSQL 嵌套事务(SAVEPOINT) 与Spring 事务传播

摘要 savepoint 关键字可以实现嵌套事务。结合savepoint关键字,更方便理解spring的事务传播。 事务嵌套 初始化表脚本 drop table t;create table t(a int, primary key(a)); 开启事务 my...

liangxiao
今天
3
0
Chrome OS 更新新版本可让Linux访问USB连接的Android设备

谷歌再次为Chrome OS带来了重大版本更新,使版本号达到了75。本次更新的一大亮点就是允许在Chrome OS上运行的Linux能够识别通过USB方式连接的Android设备,能够让用户使用Linux进行调试等等。...

linuxCool
昨天
15
0
聊聊feign的HystrixInvocationHandler

序 本文主要研究一下feign的HystrixInvocationHandler HystrixInvocationHandler feign-hystrix-10.2.3-sources.jar!/feign/hystrix/HystrixInvocationHandler.java final class HystrixInvo......

go4it
昨天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部