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

hijack00 2016-09-06 01:08:22
前些日子看到下面这样一段代码:
#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自动管理的,因而不需要我们显式释放这部分空间?
...全文
305 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-09-06
  • 打赏
  • 举报
回复
《深入解析Windows操作系统-Windows Internals》 《Windows核心编程》
hijack00 2016-09-06
  • 打赏
  • 举报
回复
引用 6 楼 pengzhixi 的回复:
可以去看看TLS方面的东西
TLS全称为Thread Local Storage,是Windows为解决一个进程中多个线程同时访问全局变量而提供的机制。TLS可以简单地由操作系统代为完成整个互斥过程,也可以由用户自己编写控制信号量的函数。当进程中的线程访问预先制定的内存空间时,操作系统会调用系统默认的或用户自定义的信号量函数,保证数据的完整性与正确性。
paschen 2016-09-06
  • 打赏
  • 举报
回复
刚好就是你括号里说的那种情况 可以再次调用该函数,可以发现之前的指针处的值已被改变
pengzhixi 2016-09-06
  • 打赏
  • 举报
回复
可以去看看TLS方面的东西
  • 打赏
  • 举报
回复
引用 4 楼 hijack00 的回复:
你说的意思是会复制一份到线程空间?那么这会涉及到内存管理吗?对这方面了解不是太多,请指教!
就是这个静态变量是每个线程都有一份,互不干扰。
hijack00 2016-09-06
  • 打赏
  • 举报
回复
引用 3 楼 akirya 的回复:
[quote=引用 2 楼 hijack00 的回复:] [quote=引用 1 楼 qq423399099 的回复:] localtime() return a pointer to static data and hence are not thread-safe localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的,不是可重入的
谢谢,利用静态存储方式虽然会带来不可重入以及增大文件体积的问题,不过确实也不用考虑动态内存分配了。 [/quote] 现在是用线程局部存储,多线程可重入。[/quote] 你说的意思是会复制一份到线程空间?那么这会涉及到内存管理吗?对这方面了解不是太多,请指教!
  • 打赏
  • 举报
回复
引用 2 楼 hijack00 的回复:
[quote=引用 1 楼 qq423399099 的回复:] localtime() return a pointer to static data and hence are not thread-safe localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的,不是可重入的
谢谢,利用静态存储方式虽然会带来不可重入以及增大文件体积的问题,不过确实也不用考虑动态内存分配了。 [/quote] 现在是用线程局部存储,多线程可重入。
hijack00 2016-09-06
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:
localtime() return a pointer to static data and hence are not thread-safe localtime返回的是static data,所以不需要释放 同时在进行多线程编程时是危险的,不是可重入的
谢谢,利用静态存储方式虽然会带来不可重入以及增大文件体积的问题,不过确实也不用考虑动态内存分配了。
小灸舞 版主 2016-09-06
  • 打赏
  • 举报
回复
localtime() return a pointer to static data and hence are not thread-safe

localtime返回的是static data,所以不需要释放
同时在进行多线程编程时是危险的,不是可重入的

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧