Mac OS X中fsevents观察者的内存泄漏

时间:2014-02-13 17:01:10

标签: c++ macos memory-leaks fsevents

我在Mac OS X中需要文件系统通知,我正在从/ dev / fsevents中读取。在Mac OS X中捕获fsevents的示例代码:http://www.codecollector.net/view/1066/raw_fsevents。在此代码中,您可以看到从/ dev / fsevents读取的缓冲区在读取后立即处理。但是当我这样做时,由于处理中产生的延迟,事件就会丢失。所以我创建了一个新的char指针并memcpy从/ dev / fsevents读取缓冲区,并将新的char *添加到队列中并在新线程中处理队列。但是当我像'print_event'中那样处理char *时'dump_entry',char *指针被重新排列,当我在处理后检查strlen()时,它只表示0或1个字节的长度。因此在处理期间,内存正在泄漏。

任何想法如何删除已分配的char *,这会为更多事件泄漏更多内存。请分享您对此的看法。提前谢谢。

1 个答案:

答案 0 :(得分:0)

只是好奇:你手动处理/ dev / fsevents的原因,而不是使用专为与之交互而设计的FSEvents接口(至少对于最常见的情况)? / dev / fsevents直接交谈非常棘手。 Ars Technica did a nice writeup.

对于这种代码,我会远离malloc和memcpy。这会给你的队列管理增加很多开销。而且我会远离手动线程管理。这正是GCD旨在处理的问题,特别是使用dispatch_data。它允许您创建可以处理和操作的不可变内存块,而无需复制。您可以使dispatch_source读取/ dev / fsevents并传回dispatch_data对象。有关示例,请参阅“并发编程指南”的Reading Data from a Descriptor部分。

“char *指针被重新排列”的含义并不十分清楚。你的意思是你在没有锁的两个线程上修改相同的变量吗?

但除非你真的需要原始访问权限,否则我会关注FSEvents接口。