当前位置:C++技术网 > 资讯 > 如何正确使用指针

如何正确使用指针

更新时间:2015-06-25 13:00:55浏览次数:1+次

    而在《为什么要规范化自己的代码》中,我讨论的是指针的规范使用最根本的的一点。请务必看看,引起重视。
    指针用来指向一个内存,指针也是程序最容易出错的地方。指针用的好不好直接反应一个人的代码质量好不好。指针的作用就是指向块内存,可以通过操作内存,最后释放内存。在使用前,很多人也知道,使用指针前先判断一下指针是否为空,然而在使用完毕后总是收尾不漂亮。
    而判断指针是否使用,不简单是判断一个指针的值是否为空。

    要做到一下几点,方可说是比较规范的用法:


    1.声明指针变量时,如果没有特定的值初始化,一定要先初始化为NULL,不要让它成为了随机值。
    本身是占用一块内存的,而这个内存内部有什么数据,如果没有初始化,是无法保证这块内存是NULL的,因为编译器没有帮忙处理。如果初始值没有设置为空,指针第一次使用时,如果忘记了赋值,而之后的步骤又判断指针是否为NULL来执行操作,可行吗?当然不可行。没有初始化为NULL,指针值是一个随机的值,绝大多数是非零值,即非NULL。这样导致指针没有指向,却被当做有指向的来操作。如果是函数指针就调用不到函数,结果崩溃。如果是内存数据指针,则会发生内存访问违规。而如果刚好值落在自己程序的地址范围内,访问了不该访问的内存,修改了状态,程序的逻辑就乱七八糟了,调错的很难。特别是混合了多线程后,问题更是麻烦。问题的重现都是一个问题。对于一个偶尔才发现的问题,你会很乐意接受吗?


    2.使用时,对指针的值和指向的内存要谨慎处理。
    如果是一个公用指针,不同的时刻指向不同的变量(内存),使用前一定要做检查。
    检查的目的就是判断指针是否已经指向了一个内存,如果有,要么将那块内存的地址先保存起来,留着之后再使用,如果再用不上了就直接释放掉。而这个判断的依据就是指针值是否为NULL。但是如果指针用完后不设为NULL,此步就没有可靠的基础了,那问题就来了。
    此处正确的做法是,先检查指针是否为空,不为空则处理好指向的内存,要么保存好地址,要么释放掉。然后立马给指针指向一个新的内存地址,表示此指针的值是有效的,不会是野指针。或者,如果指针暂时不用了,一定请记住,设置指针的值为NULL。此处非常容易出错。
    还有一点,如果在多线程中,要考虑到线程的切换问题。因为在释放内存和设置指针为NULL之间可能发生了切换。而多个线程公用一个指针,这样会导致问题。那这样做了还是没有用。这样做在单线程或者不共享指针的情况下很好。然而共享后是不够的。我们需要使用加锁操作,让这两步成为一个原子操作,保证不会被打断。这样就解决了这个问题。
    这里是我的一些开发中的总结,我也不断在努力提升自己的软件开发水平,希望大家多多指正。