• 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     

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

  • 相关阅读:
    《快速开发》通过Maven创建WebService项目Hello World!
    《常见问题集》Eclipse
    《常见问题集》Maven
    Eclipse + Jersey 发布RESTful WebService(一)了解Maven和Jersey,创建一个WS项目(成功!)
    Java2WSDL 和 WSDL2Java(Axis)
    Eclipse + Apache Axis2 发布RESTful WebService(一)基础知识
    Eclipse + Apache Axis2 发布SOAP WebService(三)第一个程序Hello Axis2 SOAP!
    Eclipse + Apache Axis2 发布RESTful WebService(三)第一个程序Hello Axis2 !(未成功)
    Eclipse + Apache Axis2 发布RESTful WebService(二)配置开发环境
    学习 JSP:第三步 JSP基础(未完)
  • 原文地址:https://www.cnblogs.com/NeilHappy/p/2983285.html
Copyright © 2020-2023  润新知