Code Bye

关于C标准库实现中的内存管理细节问题

前些日子看到下面这样一段代码:
#include <time.h>
struct tm* Now()
{
time_t now;
struct tm* gmt;
time(&now);
gmt = localtime(&now);
return gmt;
}
int main()
printf(“Now: %s\n”, asctime(Now()));
return 0;
}
可以看到,函数Now返回一个指向struct tm类型的指针。这说明在localtime或其调用的子函数中利用动态内存分配技术分配了一个struct tm类型的变量(当然也有可能在库中预先分配了静态存储空间,但是这种可能性不大。原因是这一方面会使得库函数在多线程环境下不可重入,另一方面也会增大库文件的体积)。然而,在我们调用Now函数之后,我们也没有用free之类的函数释放指针指向的存储空间。
那么,
1. 这样能否会造成内存泄露?
2. Now函数返回的指针(实质上是调用C库函数localtime返回的指针)能否是由libc自动管理的,因而不需要我们显式释放这部分空间?
解决方案

20

localtime() return a pointer to static data and hence are not thread-safe
localtime返回的是static data,所以不需要释放
同时在进行多线程编程时是危险的,不是可重入的

10

引用:
Quote: 引用:

localtime() return a pointer to static data and hence are not thread-safe
localtime返回的是static data,所以不需要释放
同时在进行多线程编程时是危险的,不是可重入的

谢谢,利用静态存储方式虽然会带来不可重入以及增大文件体积的问题,不过确实也不用考虑动态内存分配了。

现在是用线程局部存储,多线程可重入。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于C标准库实现中的内存管理细节问题