请教C语言中的一个日期函数问题(已解决)

软件和网站开发以及相关技术探讨
回复
brucezhao
帖子: 207
注册时间: 2006-10-24 10:37
联系:

请教C语言中的一个日期函数问题(已解决)

#1

帖子 brucezhao » 2009-08-14 14:23

#include "time.h"
#include "stdio.h"

int main(void)
{
struct tm *local;
time_t t;
t=time(NUL);
local=localtime(&t);
printf("Local hour is: %d\n",local->tm_hour);
local=gmtime(&t);
printf("UTC hour is: %d\n",local->tm_hour);
return 0;
}

这是网上的一段代码,我想问的是:local是一个指针,本身并没有分配内存,localtime(&t)返回一个指针类型,那么local指向的那块内存应该是由localtime函数内部分配的吧?那么这块内存没有人来负责释放,岂不是有内存泄漏?
上次由 brucezhao 在 2009-08-14 15:03,总共编辑 1 次。
头像
windwhinny
帖子: 618
注册时间: 2007-09-26 17:34

Re: 请教C语言中的一个日期函数问题

#2

帖子 windwhinny » 2009-08-14 14:52

程序退出,系统自然会释放程序的内存
brucezhao
帖子: 207
注册时间: 2006-10-24 10:37
联系:

Re: 请教C语言中的一个日期函数问题

#3

帖子 brucezhao » 2009-08-14 15:03

楼上的想法太随意了,如果写一个7*24小时的服务程序,如果有内存泄漏是很可怕的事情。

我找到了localtime的源码,它是在内部定义了一个静态变量,所以能够返回地址,而且也不会重复多次分配内存,所以这段代码没有问题。
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 请教C语言中的一个日期函数问题

#4

帖子 BigSnake.NET » 2009-08-14 15:06

brucezhao 写了:楼上的想法太随意了,如果写一个7*24小时的服务程序,如果有内存泄漏是很可怕的事情。

我找到了localtime的源码,它是在内部定义了一个静态变量,所以能够返回地址,而且也不会重复多次分配内存,所以这段代码没有问题。
不一定是静态

这类函数一般遵循谁分配谁释放的原则, 除非特别说明, 不用担心这类事情. 就是说当他是静态分配就行了
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
comfanter
帖子: 190
注册时间: 2009-05-02 14:51

Re: 请教C语言中的一个日期函数问题

#5

帖子 comfanter » 2009-08-14 15:15

1、内存泄漏是表示运行中的进程使用了new,malloc在heap上分配了内存,但在内存使用完成后没有释放,而且没有指针再指向这块内存,这块内存在当前进程中永远无法再使用或释放。

2、内存泄漏只对一个运行中进程有效,如果进程运行结束,操作系统会把这个进程所有内存释放掉,当然也包括泄漏了的内存。

3、如果一个程序只运行很短的时间,有少量的内存泄漏没有关系,因为进程一结束,进程占用的所有的内存都释放掉了。如果是长期运行的程序,特别是服务器程序,绝不能有内存泄漏。

4、内存泄漏不一定只指内存没有释放,其实程序能申请的所有资源如socket、锁、文件句柄,数据库连接等如果没有合法释放,长期运行中都会有问题,而且泄漏这些资源很多都会表现为内存被大量占用。
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 请教C语言中的一个日期函数问题

#6

帖子 linjiework » 2009-08-14 16:47

BigSnake.NET 写了:
brucezhao 写了:楼上的想法太随意了,如果写一个7*24小时的服务程序,如果有内存泄漏是很可怕的事情。

我找到了localtime的源码,它是在内部定义了一个静态变量,所以能够返回地址,而且也不会重复多次分配内存,所以这段代码没有问题。
不一定是静态

这类函数一般遵循谁分配谁释放的原则, 除非特别说明, 不用担心这类事情. 就是说当他是静态分配就行了

你这种说法不对。在标准 C 里,没有人会替你做类似释放内存这样的动作,它和类是不同的。凡是在说明文档里说是静态变量的,就一定是静态的。否则如何释放?不要告诉我程序会自动释放。

谁分配谁释放的原则这个说法没错,但用来说明 localtime 这个函数就不妥当了。
阿呆 : 天下第一呆!
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

Re: 请教C语言中的一个日期函数问题

#7

帖子 BigSnake.NET » 2009-08-14 16:54

linjiework 写了:
BigSnake.NET 写了:
brucezhao 写了:楼上的想法太随意了,如果写一个7*24小时的服务程序,如果有内存泄漏是很可怕的事情。

我找到了localtime的源码,它是在内部定义了一个静态变量,所以能够返回地址,而且也不会重复多次分配内存,所以这段代码没有问题。
不一定是静态

这类函数一般遵循谁分配谁释放的原则, 除非特别说明, 不用担心这类事情. 就是说当他是静态分配就行了

你这种说法不对。在标准 C 里,没有人会替你做类似释放内存这样的动作,它和类是不同的。凡是在说明文档里说是静态变量的,就一定是静态的。否则如何释放?不要告诉我程序会自动释放。

谁分配谁释放的原则这个说法没错,但用来说明 localtime 这个函数就不妥当了。
考虑这样一种情况, 返回的指针指向一个缓冲区, 那么这个用静态分配还是动态分配好? 静态分配的话要分配多大呢?
所以我最初看二楼回答的时候我是没有说他错的, 只要在每次重新分配时把之前的释放掉, 尽管有一块在程序退出时没有释放, 问题是不大的
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
头像
linjiework
帖子: 240
注册时间: 2009-07-07 19:52

Re: 请教C语言中的一个日期函数问题

#8

帖子 linjiework » 2009-08-14 17:16

BigSnake.NET 写了:
linjiework 写了:
BigSnake.NET 写了:
brucezhao 写了:楼上的想法太随意了,如果写一个7*24小时的服务程序,如果有内存泄漏是很可怕的事情。

我找到了localtime的源码,它是在内部定义了一个静态变量,所以能够返回地址,而且也不会重复多次分配内存,所以这段代码没有问题。
不一定是静态

这类函数一般遵循谁分配谁释放的原则, 除非特别说明, 不用担心这类事情. 就是说当他是静态分配就行了

你这种说法不对。在标准 C 里,没有人会替你做类似释放内存这样的动作,它和类是不同的。凡是在说明文档里说是静态变量的,就一定是静态的。否则如何释放?不要告诉我程序会自动释放。

谁分配谁释放的原则这个说法没错,但用来说明 localtime 这个函数就不妥当了。
考虑这样一种情况, 返回的指针指向一个缓冲区, 那么这个用静态分配还是动态分配好? 静态分配的话要分配多大呢?
所以我最初看二楼回答的时候我是没有说他错的, 只要在每次重新分配时把之前的释放掉, 尽管有一块在程序退出时没有释放, 问题是不大的

你的想法不对,作为一个标准的,大家都在使用的函数,如果大家都像你这样想,这个函数泄露一点内存,另外一个函数泄露一点内存,那最后用户还怎么敢使用这个库?
而且如果是静态分配的,对程序并没有啥影响啊。在不产生内存泄露,又不增加系统复杂度的情况下,这是一种可选方案。(虽然我觉得这样做并不是最好方法)

我觉得写程序一定要尽量严谨,否则如果做个大项目,你会痛苦不已。
阿呆 : 天下第一呆!
回复