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