zoukankan      html  css  js  c++  java
  • C/C++内存管理 笔记

         内存管理是个比较复杂的东西,我这里记录一些比较重要的笔记。

         0.永远保持谦虚的态度来使用指针和操作内存。

         1.在用free释放内存后,要记得将指针赋值为NULL,防止产生"野指针"。

         2.尽量不要用指针指向常量字符串。看一个小例子:

    char *p="abcde";
    p[0]='m';
    std::cout<<p<<std::endl;

         用gcc编译会出现警告:warning: deprecated conversion from string constant to ‘char*’.然后试着运行本程序,会出现:bus error. 

         常量字符串,那就必然是一个常量,就必然不能被更改。但是如果是用指针来引用常量字符串,就很容易将p指针与其他指向malloc分配的内存的指针混淆,造成比较难以发现的错误。如果必须要用常量字符串,我比较喜欢放在栈中,在代码中用命名来提示这是一个常量字符串,比如 char const_a[]="abcde";虽然这从本质上不是一个常量字符串,可能会有一些坏处,但我觉得这是解决这一点问题的方法之一。

         3.我觉得指针与数组的一个很大的区别就是:int a[10];int *p;sizeof(a)与sizeof(p)的差别了。sizeof(a)是整个数组的字节数,而sizeof(p)是指针的大小,32位是4字节,64位为8字节。

         4.函数的参数如果是一个数组,那么,可以理解为数组退化成了指针。一个小例子:

    void print(int a[10])
    {
        cout<<sizeof(a)<<endl;
    }
    
    int main()
    {
        int a[10];
        print(a);
        return 0;
    }

          输出的值永远是sizeof(char *)。

          5.当程序结束时,会释放所有内存,包括在堆中的和在栈中的,以及在静态存储区的。

          6.free(p)。如果p是NULL指针,那么free对p无论操作多少次都不会处问题。如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

          7.new和delete在处理动态对象的时候,会分别自动调用对象的构造函数和析构函数,而malloc/free却没有这样的功能。这是因为malloc/free是库函数而不是运算符。C++中可以通过重载运算符来为new/delete添加功能,但是却不能改变库函数的作用(因为编译器没有这样的控制权限)。所以在进行动态对象的内存管理时,应该使用new/delete而不是malloc/free.

     

          参考资料:http://www.360doc.com/content/06/0813/14/6878_180157.shtml     

           如果你觉得我的文章对你有帮助,请推荐一下,非常感谢!

  • 相关阅读:
    pyqt 实现左列表向右列表添加
    python 获取ffmpeg里可以推送的音视频设备名称
    精确控制windows全局音量二(Python)
    精确控制windows全局音量(Python)
    ${pagecontext.request.contextpath}绝对路径理解
    eclipse中修改JSP模板中的默认编码
    hibernate的ddl-auto属性
    乱码-eclipse显示中文16进制的
    在写数据库相关项目时,出现The server time zone value '�й���׼ʱ��' is unrecogni异常。
    mysql5.7.28安装和配置
  • 原文地址:https://www.cnblogs.com/NeilHappy/p/2983285.html
Copyright © 2011-2022 走看看