URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 21 » 这样的函数难道不会引起内存泄露吗?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
这样的函数难道不会引起内存泄露吗?
 
 
 
 
 
 
 
 
 
 
 
 
Subject: 这样的函数难道不会引起内存泄露吗?
Author: onlyflyer1    Posted: 2005-12-01 20:01    Length: 410 byte(s)
[Original] [Print] [Top]
我看到很多c库的函数是以下类型的
struct somestruct *func(void)
也就是函数能够返回一个指针,只想你想要的结果。很明显返回的指针指向一个在func中分配的内存,按道理将用完func后应该释放掉这快内存,但是我在看一下源代码的时候发现很多程序(几乎是所有)都没有进行free()操作。这是为什么?难道是我们不在乎这点内存?不可能吧?哈哈
举个这样函数的例子
struct passwd* getpwuid(__uid_t, __uid)
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: onlyflyer1    Posted: 2005-12-01 20:20    Length: 217 byte(s)
[Original] [Print] [Top]
呵呵,我好像突然明白了
我们假设使用函数func,我们必须包含声明它的头文件,所以说内存的分配是在该头文件中,在编译的时候就应该已经包含进去了,所以说使用完了以后不必释放内存,是这个样子的吗?我还没有考证,请指点。
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: hsen    Posted: 2005-12-01 21:16    Length: 306 byte(s)
[Original] [Print] [Top]
这种函数一般都是非线程安全的函数,你看看这个函数就明白了,
void f()
{
time_t n = time(NULL);
struct tm * now = localtime(&n);
printf("%p ", now);
now = localtime(&n);
printf("%p ", now);
}
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: onlyflyer1    Posted: 2005-12-01 22:15    Length: 168 byte(s)
[Original] [Print] [Top]
是不是就是因为函数使用的内存是在头文件中预留的空间,从而导致所有的函数都使用这个内存空间,当有多个线程访问该空间时,就容易发生冲突,从而导致线程不安全,是不是这个原理?
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: onlyflyer1    Posted: 2005-12-02 00:13    Length: 140 byte(s)
[Original] [Print] [Top]
没有人指点吗?
我又看到了这样一个函数g_convert,这个函数返回的是一个字符串指针,这感觉用上述的理论就不符合了。知道的人能提醒一下吗?
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: Atu    Posted: 2005-12-02 08:35    Length: 1,727 byte(s)
[Original] [Print] [Top]
> 没有人指点吗?
> 知道的人能提醒一下吗?
太心急了一点了吧?
熬夜上网的人,到这里来的不多,更多的都去聊天了 :-)

关于这个问题,我的个人想法是
它使用了静态变量(或者是全局变量?),并且返回它的指针给你了。

你的猜测基本是对的,就是它预分配了空间,并且每次返回的都是同一块地方
但是你说的有一点错误:内存不是在头文件中分配的。

看这个代码

#include <pwd.h>
#include <stdio.h>
#include <sys/types.h>

int main()
{
struct passwd *pw = getpwnam("nobody");
printf("pw = %p ", pw);
struct passwd *pw2 = getpwnam("root");
printf("pw2 = %p ", pw2);
printf("pw = %p ", pw);
printf("pw->name = %s ", pw->pw_name);
printf("pw2->name = %s ", pw2->pw_name);
}

它的输出结果就是

pw = 0x42133a78
pw2 = 0x42133a78
pw = 0x42133a78
pw->name = root
pw2->name = root


先后两次调用返回的是同一个指针。

这种函数很多,如get...by...系列,
这些函数是非线程安全的——如果你不知道什么是线程,就当我没说。

要在线程中使用这些函数,应该使用它们的线程安全版本,
就是后面加上一个_r后缀的函数,如getpwnam_r, getpwuid_r等
这些函数一般都需要你自己先分配好内存传给它使用——相对不方便了。
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: onlyflyer1    Posted: 2005-12-02 10:38    Length: 224 byte(s)
[Original] [Print] [Top]
我明白你的意思。但是我昨天在使用glib库中的g_convert函数的时候,发现另一个问题。
该函数返回的是一个gchar *的指针,这个指针每次指向的地方是不一样的。。。看来这种函数的实现方法还是很灵活的!!!需要特别注意!
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: h_falls    Posted: 2005-12-02 11:31    Length: 101 byte(s)
[Original] [Print] [Top]
g_convert 返回的指针是malloc的,需要你自己free

为啥不看看 g_convert的 manual 呢?
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: eikes    Posted: 2005-12-02 11:55    Length: 55 byte(s)
[Original] [Print] [Top]
若是静态或全局变量的话,pw2怎么没有覆盖pw(内容)呢?问
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: zhangxp    Posted: 2005-12-02 13:32    Length: 196 byte(s)
[Original] [Print] [Top]
函数内部使用了静态变量。不是malloc淂,所以不用free。

static char str[100];

return str;

静态变量在函数返回后,还存在于内存中。好像是bss段吧
----
天若有情天亦老,人间正道是沧桑。
[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: Atu    Posted: 2005-12-02 14:43    Length: 248 byte(s)
[Original] [Print] [Top]
> 若是静态或全局变量的话,pw2怎么没有覆盖pw(内容)呢?问

什么意思?

程序的结果已经很清楚的显示了,pw2和pw指向同一个内存地址,
而且第二次查询的结果也覆盖了第一次查询的结果。

[Original] [Print] [Top]
Subject: Re: 这样的函数难道不会引起内存泄露吗?
Author: hsen    Posted: 2005-12-02 17:14    Length: 25 byte(s)
[Original] [Print] [Top]
佩服Atu,回答问题够仔细。
[Original] [Print] [Top]
« Previous thread
crt1.o的作用
C/C++编程版
21
Next thread »
有人用过COMEDI吗?可以互相交流一下!
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:24, cost 0.49507808685303 ms.