内存管理(——高质量程序设计语言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时不要返回“栈内指针”,即返回指向在程序堆栈上分配的内存,当返回时,内存被释放了,所以没有任何意义。

posted @ 2015-07-27 21:21  弱水三千12138  阅读(199)  评论(0编辑  收藏  举报