动态分配内存

动态分配内存专题

关于动态分配内存:

局部变量在栈中分配空间,静态变量和全局变量在静态存储区分配空间,动态内存分配,主要是在堆中分配空间。

为什么使用动态内存分配

1.声明数组时,必须在编译时知道他的长度,有些数组的长度常常在运行时才知道,若提前声明过大的数组,则会造成空间浪费。

2.当函数返回值为一个指针时,需要在函数运行时进行动态内存分配。

分配内存

其中alloca可以自动释放已分配的内存,但其他三个函数需要和free配合使用。

(1)malloc

void *malloc(size_t size);函数的参数直接是需要分配的内存字节数,返回值为一个指向被分配的内存块起始位置的指针。如果无法提供更多的内存,则返回NULL指针,因此需要对malloc返回的指针都进行检查,确保非NULL,通常和memset配合使用,一般声明如下:

 1 int *pi;
 2 pi = malloc(25*sizeof(int));
 3 
 4 cv::Point * temp = (cv::Point*)malloc(root_points.size()*sizeof(cv::Point*));////强制转换成Point*
 5 if (temp == NULL){
 6     printf("Out of momery!")
 7         exit(1);
 8 }
 9 cv::Point* ppt[1] = { temp };
10 
11 //cv::Point* ppt[1] = { (cv::Point*) malloc(root_points.size()) };//和4,9行的结果是一样的,malloc返回指针,因此可以直接作为指针数组的元素
12 for (size_t index = 0; index < root_points.size(); index++)
13     ppt[0][index] = root_points[index];
14 const cv::Point* ppt_[1] = { ppt[0] };//指针数组初始化,二维数组的每一行当做其元素

注意:第2行中动态开辟内存时,并不是sizeof(int*),因为pi是指向整型的指针,是对pi指向的地址开辟内存,里面存储的是整型数值;如果是int **pi,则后面应该是sizeof(int*);尽量不要使用11行的方式初始化,因为无法释放,容易内存泄漏,4和9行可以对开辟的内存进行释放,更安全。

(2)calloc

void *calloc(size_t num_elements, size_t element_size);

calloc也用于分配内存,与malloc有两个区别:1.calloc分配内存后,返回指向内存的指针之前会把它初始化为0;2.函数原型不同,calloc包括所需元素数量和每个元素的字节数

(3)realloc

void *realloc(void *ptr, size_t new_size);

realloc用于修改一个原先已经分配的内存块大小,使用这个函数可以将一块内存扩大或缩小。

如果用于扩大一个内存块,该内存块原有内容保留,新增加的内存块添加到原有块的后面,若缩小一个块,该内存块的尾部部分先被拿掉,剩余内存部分原有内容保留。

若原有块无法改变大小,则realloc将分配另一块正确大小的内存,并把原有块内容复制到新块上。因此realloc后,不能使用指向旧内存的指针了,应该改用realloc返回的新指针

(4)alloca函数开辟内存后,不用free手动释放

释放内存

动态分配的内存必须整块一起释放,但realloc函数可以缩小一块动态分配的内存,释放和缩小是不一样的。

void free(void *pointer),free的参数应该是malloc、calloc、realloc返回的值,或者是NULL,如果传递是的NULL,则不会产生任何效果。

free函数的值是指针的值,而不仅仅只是申请动态内存的那个标识符,当动态开辟内存的指针复制之后,任一拷贝都可以将该内存释放,释放后,其他拷贝将不能访问该内存。

内存泄漏

内存泄漏是指内存被动态分配后,当它不再使用时未被释放,内存泄漏会增加程序的体积,有可能会导致程序或系统的崩溃,因为堆上的空间是有限的。

 结构体指针和成员指针动态分配内存

结构体中有成员为指针类型,若结构体和指针成员同时开辟了内存,在释放时,需要先释放指针成员的内存,再释放结构体指针,若反之,则无法释放指针成员的内存,从而使程序报错。另外,若只释放结构体指针,并不会释放结构体成员指针。

野指针,指向一个删除内存的但为置零的指针,或未申请内存区域的指针。

原文地址:https://www.cnblogs.com/qinguoyi/p/10130440.html