【发布时间】:2014-09-09 20:02:42
【问题描述】:
我理解CFSTR() documentation 表示它分配内存。它可以在失败时返回 NULL,并且无论是否调用 CFRelease() 或删除引用,结果都可用,直到程序终止。它包装了静态字符串,但它肯定必须分配一个 CFString 类结构来这样做。因此,它不适合在长时间运行的程序中使用。
但是,在对此进行了一些反对之后,我尝试了以下测试程序。我没有看到top 中的内存占用增加。 valgrind 报告的泄漏不随循环大小而变化。是否发生重复数据删除?
#include <CoreFoundation/CFString.h>
#include <stdio.h>
int main(void) {
int count = 0;
int chars = 0;
for (int i = 0; i < 100000000; i++) {
CFStringRef str = CFSTR("Goodbye.");
if (str) {
count++;
chars += CFStringGetLength(str);
// Drop reference!
}
}
printf("%d strings, %d chars\n", count, chars);
CFStringRef str = CFSTR("Hello, World.");
CFShowStr(str);
}
另一个提问者reported CFSTR() 确实在 Windows 上泄漏。其他人说这就像 Objective C 的 @"String" 文字语法。 CFString 参考提到在 gcc 3.3 上需要 -fconstant-cfstrings。那么宏是否使用魔法编译器扩展在构建时创建这些?
在我的 MacOS X 10.8.5 机器上,CoreFoundation/CFString.h 在 Windows 或 Linux 上将 CFSTR 定义为 __builtin___CFStringMakeConstantStringexcept,它使用非内置版本。
所以答案似乎很可能是,“它不会在 MacOS X 或 iOS 上分配”。
我不知道如何验证它们实际上作为 CFStringRefs 存在于可执行文件中,但 otool -tV 说:
leaq 0x1c8(%rip), %rax ## Objc cfstring ref: @"Goodbye."
指令指针相对寻址是一些确认,leaq 表示它没有调用任何可以分配的东西。
【问题讨论】:
标签: c macos memory memory-leaks core-foundation