首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-09 
关于内存释放的一个问题!刚分析了一个大师用C++对C库中目录操作函数的封装。有一个地方,有一点疑问。就是rea

关于内存释放的一个问题!
刚分析了一个大师用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;
}

[解决办法]
readdir

这个东西代码呢
[解决办法]
不会泄漏。因为返回的指针指向一个内部结构,这个内部结构(在C里不能称对象,姑且这么说吧,是struct)由标准库建立、分配内存并销毁。所以不必当心它的内存泄漏问题。
但是对于dp,你要注意了,你用opendir获得dp,必须用closedir关闭它!如果你不这么做,几乎一定会造成内存泄漏的!其实刚才说dirent结构无须由你销毁,标准库的一种做法正是在opendir时创建所有的dirent结构,并在closedir时销毁它们。(当然标准库的实现方式是由设计者决定的,他可以不用这种方式。)因此,对于成对出现的操作,不要漏掉其中之一;因为,它们背后往往代表着malloc和free;或用C++的语言:new和delete.

热点排行