我了解CFSTR()文档以表明它分配了内存。它可以在失败时返回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);
}
Run Code Online (Sandbox Code Playgroud)
另一个询问者报告说CFSTR()在Windows上确实泄漏。其他人则说这就像是Objective C的@"String"文字语法。CFString参考提到-fconstant-cfstrings在gcc 3.3上需要。宏是否在构建时使用魔术编译器扩展来创建这些扩展?
在我的MacOS X 10.8.5机的CoreFoundation / CFString.h定义CFSTR因为__builtin___CFStringMakeConstantString 除了在Windows或Linux,它使用非内置版本。
因此,似乎答案可能是“ …