函数的可重入与不可重入内部内存分配方式(内存泄漏陷阱,在很多函数中都存在的问题)

本文探讨了可重入与不可重入函数的区别,特别是`localtime`与`localtime_r`。不可重入函数`localtime`使用静态内存可能导致多线程环境下数据覆盖,引发内存泄漏。而可重入函数`localtime_r`需要传入外部内存空间,避免了这些问题。此外,介绍了`const`关键字在函数参数中的作用,以及如何正确传递指针以避免段错误。
摘要由CSDN通过智能技术生成

如下3个函数中,localtime为不可重入,localtime_r可重入,加const为输入型参数,不加const为输出型参数。

1、struct tm *localtime(const time_t *timep);
2、struct tm *localtime_r(const time_t *timep, struct tm *result);

3、size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

(1)不可重入函数localtime。

        这个函数在返回的时候,返回的是一个指针,实际的内存是localtime内部通过static申请的静态内存,所以通过localtime调用后的返回值不及时使用的话,很有可能被其他线程localtime调用所覆盖掉,比如CPU执行线程A时使用该函数获取后,准备打印,这时CPU进入线程B,线程B中正好调用localtime并执行,然后回到线程A中执行printf打印时间,这时线程A的时间被线程B调用的localtime覆盖了,导致得到错误的时间。如下代码,结果一样,是因为ptm与ptmEnd指针指向的是同一个指针地址空间。 

  1. #include <iostream>  
  2. #include <ctime>  
  3. using namespace std;  
  4.   
  5. int main()  
  6. {  
  7.     time_t tNow =time(NULL);  
  8.     time_t tEnd = tNow + 3600;  
  9.   
  10.     struct tm* pt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值