c++内存分配 -- new, delete, malloc, free

只为因内存分配而无法入眠的程序员,也为了自己

转载地址:  C++内存分配秘籍—new,malloc,GlobalAlloc详解

一、关于内存

1.内存分配方式

内存的分配方式有3种:

(1)从静态存储区域分配。内存在程序编译的时候就已经分配好了,这块内存在程序运行期间都存在。

例如:全局变量,static变量。

(2)在栈上创建。在函数执行时,将在栈上分配运行期间变量的内存,函数执行结束时这些内存将自动释放。

栈内存内置于处理器的指令集中,效率很高但容量有限。

(3)从堆上分配,又叫动态内存分配。程序在运行期间用malloc或new申请任意的内存空间,程序员自己负责在何时用free或delete释放内存。

动态内存的生命周期由我们决定,使用灵活,程序内存出现问题大都在这里。

2.内存使用错误

发生内存错误是非常麻烦的。编译器不能自动发现这些错误,一般是在程序运行时才被捕捉到。

这些错误大多没有明显症状,时隐时现,增加了改错难度。

常见的内存错误及对策:

(1)内存分配未成功,就使用了它。

内存分配函数失败几率很小,但是你不可避免的会遇到。

常用的方法是在使用内存之前检查指针是否为NULL。if(p == NULL)进行放错处理。

(2)内存分配成功,但尚未初始化就引用它。

这里要培养初始化的概念。

指针的初始化一般赋值为NULL,其他初始化为0。

(3)内存分配初始化成功,但是超过了边界。

在使用的时候要特别注意,特别是循环的时候更要注意。

(4)没有释放内存,造成内存泄漏。

有这种错误的函数每调用一次就丢失一块内存,终有内存耗尽的时候。

动态内存的使用,程序中nalloc和free(new和delete)成对出现就会减少错误的可能。

(5)释放完了的内存还有使用。

没有管理好动态内存。

返回了栈内存,在函数中返回指向栈内存的指针或引用,栈内存在函数结束时被自动销毁。

野指针,释放内存后没有将指针设为NULL。

这里在编写程序时要注意遵守几点规则

【规则1】申请内存后应立即检查指针是否为NULL,防止使用指针为NULL的内存。

【规则2】为数组和动态内存赋初值,防止使用为初始化的内存。

【规则3】特别注意数组和指针是否越界。

【规则4】动态内存的申请与释放必须成对。

【规则5】释放内存后将指针赋值为NULL,防止产生野指针。


  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页