• free 和 delete 把指针怎么了


    使用free或delete之后,只是把指针所指的内容给释放掉,但是指针并没有被干掉,还是指向原来位置(并不是执行NULL),此时指针指向的内容为垃圾,被称为“野指针”。

    举例说明几个重要容易迷糊的特征:

    1. 指针消亡了,并不表示他所指向的内存会被自动释放。例:

    void func(coid)
    {
       char *p = (char *)malloc(sizeof(char) * 100);
    }

    当函数执行完时,指针变量因为存在于栈上,会自动消亡。但是这不意味着分配的空间也会自动释放,原因是:动态非配的空间位于堆(动态内存分配区),必须自己去释放;否则,调用一次函数,造成一次内存泄露。

    2. 内存被释放了,并不表示指针会自动消亡或变成NULL指针。例如

    char *p = (char *)malloc(sizeof(char) * 100);
    cout << &p << endl;
    free p; cout
    << &p << endl;

    可以看出两次输出是一样的,也就是说虽然内容被释放掉了。但是指针还是指向原地。因此释放掉指针后,应该立马赋值为NULL。

    杜绝“野指针”

    • 指针变量要初始化。要么为NULL,要么为合法的内存
    • 指针被释放掉时,将指针置位NULL
    • 防止指针超越了变量的作用范围。例:
        for(int i=0; i<2; ++i)
        {
            p = &i;
        }
        cout << *p << endl;
        cout << i << endl;
  • 相关阅读:
    Scala学习随笔——控制语句
    Scala学习随笔——深入类和对象
    Scala学习随笔——Scala起步
    HashMap,HashTable,concurrentHashMap,LinkedHashMap 区别
    vector
    LinkedList,HashSet,HashMap
    ArrayList底层实现
    jion()说明
    yiled(),wait(),sleep()方法区别
    synchronized关键字
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3247687.html
Copyright © 2020-2023  润新知