内存管理是个比较复杂的东西,我这里记录一些比较重要的笔记。
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
如果你觉得我的文章对你有帮助,请推荐一下,非常感谢!