菜鸟编程 指针初步

这里,笔者想分享一点关于指针和动态内存分配的内容。

在分享之前,笔者先简单分享一下各个内存区域及他们的存储内容。

全局名称空间,存储全局变量

自由存储区(也称为堆),也是与动态内存分配相关的内容,需要用new和delete关键字来操作。

寄存器(cpu内部工作使用),一般不能直接使用,可以用register来定义,如:register int x,但如果寄存器不能存储,那么会自动转为自动变量,存在栈里。

代码空间,存储代码

堆栈(也称为栈),用于存储局部变量与函数参数。


动态内存分配:

C++的动态变量的创建需要关键字new,可以创建一个简单变量或是一个数组。如: new int x, new int[10]。

这个操作在堆的区域中申请一块空间。但是由于堆的空间也是有限的,所以需要检查是否成功申请到空间,这里需要用到cassert。

例如:

#include <iostream>

#include <cassert>

using namespace std;

int main()

{

        int *p = new int;

        assert(p != 0);

        *p = 20;

        cout << *p;

        delete p;

        p = NULL;


        return 0;

}

这里assert()给它一个参数,就是一个为true的表达式,如果不是true,那么就会发出一个错误消息,然后程序终止。

对于创建的一个一维数组,int *p = new int[10]; p指向的是这个数组的首地址,也就相当于一个数组名字。

动态的数组和静态的数组一个很大的差别就在于,动态数组的规模可以是程序运行中某一个变量的值甚至是一个表达式的运行结果。而普通数组必须要在编译时就能确定下来。

int *p = new int[2*m+n]; 是正确的,但不能写 int p[2*m+n];

关于上面代码的delete关键字,它是用于回收动态变量。如果一个全局函数中申请了一个int *p = new int,那么这个函数运行完之后,仍然可以在其他的函数中用p来访问这块空间。所以需要它“死掉”的时候,需要告诉它“你要死掉”,也就是需要delete。如果要delete一个数组,那么需要写成 delete [] 指针变量名。之所以在delete 之后又将p赋值为空指针,是因为delete 指针p后,指针p没有指向的地址,也就是它是一个迷途指针。这是很危险的。


关于内存泄漏:
内存泄漏是用动态变量申请机制申请了一个变量,而后不需要这个变量的时候,又没有delete 它,或者是,这个指针没有delete之前,又将它指向了另外一个地址,原先的数据就找不到了。这样的情况应该尽量避免。



以上是笔者对动态内存分配的简单分享,如果有出问题的地方,还请指明更正,谢谢!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值