内存管理(——高质量程序设计语言C/C++第16章)
内存的分配方式:
1.静态存储区分配:全局变量,static变量等,在程序编译时已经分配了存储内存,在程序运行的整个期间一直存在
2.程序的堆栈上:程序的局部变量,包括程序的形参等,只存在于程序的运行期间
3在堆heap上分配的:动态内存分配,malloc或者new
常见的内存错误:
(1)内存分配未成功,却使用它了。记得malloc时要判断返回的是否是NULL,若为NULL则说明动态分配内存失败
(2)内存分配成功了要记得初始化,malloc完了
calloc :(元素个数,元素大小),calloc在分配完内存后会初始化为0
realloc:(指针,新的大小),修改已经分配过的内存的大小,扩大或者缩小,若是扩大会在后面添加,不会改变原来的数据
malloc:(字节大小),不会自己进行初始化
(3)内存分配成功了,但在访问时越界了,超出了分配的内存的大小
(4)忘记释放掉动态分配的内存,或者只是释放了一部分,这样函数每调用一次都会丢失一次内存,会内存泄露,最后程序崩溃
(5)已经将内存给free掉了,但是没有把指针指向NULL,变成了野指针,还在使用它,会出现不可预料的情况。
指针的参数是如何传递的
(1)不要把函数的参数为指针的作为开辟动态内存的指针
例如: void getmemory(int* ptr)
{ ptr=(int*)malloc(sizeof(int)*10);}
在这里当调用这个函数时,传入的实参时,拷贝一个指针变量ptr的值,给他,然后在函数内开辟内存时,相当于改变这个实参的值(即地址)
对于形参时没有变化了。
这里可以使用指向指针的指针或者指针的引用。
函数的return时不要返回“栈内指针”,即返回指向在程序堆栈上分配的内存,当返回时,内存被释放了,所以没有任何意义。