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     

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

原文地址:https://www.cnblogs.com/NeilHappy/p/2983285.html