CFSTR()是否分配内存?

 痞子彪2012_890 发布于 2022-12-22 10:08

我了解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这意味着它没有调用任何可以分配的内容。

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有