前些日子看到下面这样一段代码:
#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自动管理的,因而不需要我们显式释放这部分空间?
#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,所以不需要释放
同时在进行多线程编程时是危险的,不是可重入的
localtime返回的是static data,所以不需要释放
同时在进行多线程编程时是危险的,不是可重入的
10
现在是用线程局部存储,多线程可重入。