我了解CFSTR()文档以表明它分配了内存。它可以在失败时返回NULL,并且结果可以使用,直到程序终止为止,而不管是调用CFRelease()还是删除引用。它包装了静态字符串,但是一定要分配一个CFString类结构来这样做。因此,不适合在长时间运行的程序中使用。
但是,在对此进行了一些推后,我尝试了以下测试程序。我看不到内存占用top
增加。valgrind报告的泄漏不随循环大小而变化。是否有重复数据删除?
#include#include 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); }
另一个询问者报告说CFSTR()在Windows上确实泄漏。其他人则说这就像是Objective C的@"String"
文字语法。CFString参考提到-fconstant-cfstrings
在gcc 3.3上需要。宏是否在构建时使用魔术编译器扩展来创建这些扩展?
在我的MacOS X 10.8.5机的CoreFoundation / CFString.h定义CFSTR因为__builtin___CFStringMakeConstantString
除了在Windows或Linux,它使用非内置版本。
因此,似乎答案可能是“ 它不在MacOS X或iOS上分配 ”。
我不知道如何验证它们是否作为CFStringRefs实际存在于可执行文件中,但是otool -tV
说:
leaq 0x1c8(%rip), %rax ## Objc cfstring ref: @"Goodbye."
指令指针相对寻址是一种确认,leaq
这意味着它没有调用任何可以分配的内容。