C++内存管理

内存管理

1、C++跟Java不同,大多数情况需要程序员自己分配和释放内存,否则可能造成内存泄露等不良情况。


1.1 内存分配方式

内存分配有三种方式,对每一种的操作情况都要很熟悉,要不然会出错。

(1)静态存储区: 程序中定义的全局变量和static静态变量是在这个区域存储,程序运行之前已由编译器分配好,整个程序运行期间都会存在。如果你认为只是这些,那就大错啦,常量字符串也在这里,

如:char *p = “hello world”;

      p[1] = ‘b’;  //出错啦

指针p指向了常量字符串,“hello world”被分配到静态存储区域,你可能认为没什么不妥,编译器也认为ok,但是就是错,常量字符串是不能修改的。

(2)栈:栈内存分配运算内置于处理器的指令集中,效率非常高,但每个OS分配的栈大小都是有限的,有的OS分配的时8MB,反正不是很大。栈是我们常用到的内存分配区域,如定义个变量(int a = 10;),a就分配在栈中;此外还有函数执行时的内部变量;还有递归函数也会用到栈,而且更能突显栈的后进先出特点。栈的内存释放是自动释放的,不需手动释放,虽不用考虑内存泄露问题,但一定要考虑到栈溢出的情况,如函数递归调用超级多,就很可能到时导致栈溢出而使得程序崩溃。

(3)堆:也称动态内存分配,是问题出现最多的。由程序员用malloc/new来分配,注意malloc与new的区别,以及两者返回类型的区别;用完之后用free/delete释放。但这里有一容易忽略的问题,释放内存时,虽然指针所指向的内存释放了,但指针依旧指向这块内存,但这块内存却不能再用了,此时指针就变成了野指针,oh,好可恶。


1.2 常见的错误

(1)分配指针失败,却忘了判断就直接进行操作

如 int * p = new int[10];

如果找不到足够大的内存块,new返回NULL。此时操作指针p,会出错。所以分配内存之后一定要先判断再使用。

(2)分配成功,但是忘了初始化了,然后又用了。

如 int b;

    int * p = new int[10];

    b = p[0];

此时a没有初始化,是随机值。一定要先初始化。

(3)内存越界

不能访问p[10],p指向的时0-9十个元素,不要访问之外的元素。

(4)释放内存方面的错误:忘了释放导致内存泄露;释放了内存还在使用。

这里着重谈下返回指向“栈内存”的指针或引用的错误。

我们知道栈内存再一段程序结束后便收回内存,此时如果作为函数返回值,无疑会出现错误。

char * f(void)

{

char str[] = “hello”;

return str;

}

int main(void)

{

char * p = f();

return 0;

}

str是分配在栈内存上得,千万别和前面提到的  char *p = “hello world”;   搞混,函数执行完之后,str指向的内存便被释放,指针p可能指向的是乱码。

char * f(void)

{

char * str = “hello”;

return str;

}

改成这样不会出错,但是意义不大,指针p指向的时静态区域,“hello”为只读,不可更改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值