关于内存释放的一个问题!

coolnick 2007-05-29 09:39:51
刚分析了一个大师用C++对C库中目录操作函数的封装。
有一个地方,有一点疑问。
就是read成员函数的定义中有一句:
dirent* r = readdir(dp);
调用readdir时, 内核会为r分配一块内存;那么这块内存
应该由谁来释放?为什么这里没有释放r所指向内存的操作?
这不是存在内存泄露吗?
其实read成员函数的参数是引用类型, 就是为了类的用户避免面对
讨厌的内存问题,但read函数内部确还是同样存在内存问题。

请大家一起来分析!
class Dir
{
public:
Dir(const char*);
int read(dirent&);
....
private:
DIR* dp;
};

Dir::Dir(const char* file): dp(opendir(file)){}
int Dir::read(dirent& d)
{
if (dp)
{
dirent* r = readdir(dp);
if (r)
{
d = *r;
return 1;
}
}
return 0;
}
...全文
311 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolnick 2007-05-29
  • 打赏
  • 举报
回复
多谢
Chiyer(星羽) 与 Vitin(卫亭) 两位!
Vitin 2007-05-29
  • 打赏
  • 举报
回复
不会泄漏。因为返回的指针指向一个内部结构,这个内部结构(在C里不能称对象,姑且这么说吧,是struct)由标准库建立、分配内存并销毁。所以不必当心它的内存泄漏问题。
但是对于dp,你要注意了,你用opendir获得dp,必须用closedir关闭它!如果你不这么做,几乎一定会造成内存泄漏的!其实刚才说dirent结构无须由你销毁,标准库的一种做法正是在opendir时创建所有的dirent结构,并在closedir时销毁它们。(当然标准库的实现方式是由设计者决定的,他可以不用这种方式。)因此,对于成对出现的操作,不要漏掉其中之一;因为,它们背后往往代表着malloc和free;或用C++的语言:new和delete.
星羽 2007-05-29
  • 打赏
  • 举报
回复
就是 closedir 释放 DIR 的时候释放
星羽 2007-05-29
  • 打赏
  • 举报
回复
不看!!

你发贴最好说声平台吧,这个东西又不是标准c的,




刚刚去找了readdir的源码看看,linux不是开源的吗?

=======================


struct dirent* readdir(DIR *d) {
if (!d->num || (d->cur += ((struct dirent*)(d->buf+d->cur))->d_reclen)>=d->num) {
int res=getdents(d->fd,(struct dirent*)d->buf,sizeof (d->buf)-1);
if (res<=0) return 0;
d->num=res; d->cur=0;
}
return (struct dirent*)(d->buf+d->cur);
}



你看了这个就明白了

所以这个东西是DIR *d维护的,

应该在close DIR *d 的时候会释放
coolnick 2007-05-29
  • 打赏
  • 举报
回复
汗~~~~
这种问题是很普遍的一个问题~~~~
建议你看看UNIX环境高级编程,第一版P81
星羽 2007-05-29
  • 打赏
  • 举报
回复
估计是 linux 的 :)
星羽 2007-05-29
  • 打赏
  • 举报
回复
我找不到这个东西 = =!

连msdn里都没有
coolnick 2007-05-29
  • 打赏
  • 举报
回复
楼上的,readdir是C库接口~~~
星羽 2007-05-29
  • 打赏
  • 举报
回复
readdir

这个东西代码呢

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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