Authur Whywait 做一块努力吸收知识的海绵~
如果赶时间,直接向下滑动并看粗体字即可。
我们在进行做数据结构相关编程题的时候,常会遇到最后要释放结构体的情况。
这也是这部片文章需要说的内容。
文章从以下几方面入手,讲述结构体释放操作中几点值得注意的事情。
语言:C
free()
首先释放结构体,我们要使用到free()函数。
说到free()不得不提到malloc()。
所以与其说是将如何释放结构体,不如说如何使用free释放结构体。
使用事项
- 释放结构体时,需要把结构体里面的数据结构释放之后,再释放结构体。
直接上例子:
typedef struct Stack{
int* val;
int valSize;
int top;
} BSTIterator;
void bSTIteratorFree(BSTIterator* obj) {
if(obj && obj->val) free(obj->val);
if(obj) free(obj);
}
如果obj本身为NULL,就没必要释放了。
- 关于结构体定义
再看下面这个例子:
typedef struct Stack{
int val[10000]
int top;
} BSTIterator;
void bSTIteratorFree(BSTIterator* obj) {
if(obj && obj->val) free(obj->val);
if(obj) free(obj);
}
看似没问题,先释放结构体里面的数据结构然后释放结构体,其实是你对struct结构体的定义不是很理解。
看下图你可能就可以自己分析出原因了。
此为运行结果
说明了什么呢?
val[10000]为一静态数组。结构体就包括了整个数组。
而上文中提到的int* val;
,说明结构体里面包括的只是一个指针,也就是存储int
型数据的地址。
这就是区别。
怎么改呢?
typedef struct Stack{
int val[10000]
int top;
} BSTIterator;
void bSTIteratorFree(BSTIterator* obj) {
if(obj) free(obj);
}
如此就可以将结构体释放干净。
总结
几个malloc()
就配上几个free()
。