发现内存泄漏问题 cStringUsingEncoding

2024-01-04

嘿,我正在尝试使用 cStringUsingEncoding 将 NSString 转换为 C 字符串,但出现内存泄漏。我的理解是 cStringUsingEncoding 返回一个指向字符数组的指针,该数组仅保证在 NSString 对象的持续时间内存在。因此,您应该将其内容复制到另一个字符串。这就是我的问题所在......

我有一个函数接受 NSString 并将其转换为 C 字符串副本。为了进行测试,我对以下方法进行了 1,000 次迭代(以确保没有泄漏)。

 -(void)test{
      NSString *test = [[NSString alloc] initWithString:@"Hello world!"];

      for(int i=0; i<1000; i++)
      {
           char *tmp = [self returnCopiedCString:test];

           //free memory
           free(tmp);
      }

      [test release];
 }

非常简单的代码......问题是它疯狂地泄漏。现在,在您得出结论之前,我的 returnCopiedCString 函数运行得很好。我通过声明并复制 C 字符串来测试它,以排除出现问题的可能性。在函数内部我使用以下代码来转换它

 -(char *)returnCopiedCString:(NSString *)input{
      //retain input
      [input retain];

      //get length of encoded C-string
      int len = [input lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

      //allocate memory for new C-string + null terminated byte
      char *toReturn = (char *)malloc((sizeof(char) * len) +1);

      //copy NSString to C-string
      strcpy(toReturn,[input cStringUsingEncoding:NSUTF8StringEncoding]);

      //release input
      [input release];

      //return pointer to newly copied string
      return toReturn;
 }

也非常简单。然后我开始仔细思考,也许是因为我在 for 循环之外声明了 test,因此它永远不会被释放,我将所有这些 const char* 留在 cStringUsingEncoding 方法中。所以我将第一个函数更改为如下:

 -(void)test{
      for(int i=0; i<1000; i++)
      {
           NSString *test = [[NSString alloc] initWithString:@"Hello world!"];

           char *tmp = [self returnCopiedCString:test];

           //free memory
           [test release];
           free(tmp);
      }
 }

但仍然没有运气。有人对这里可能出现的问题有任何想法吗?提前谢谢大家!


来自文档:

仅在释放接收者或清空当前自动释放池(以先发生者为准)之前,保证返回的 C 字符串有效。如果需要存储超出此时间的 C 字符串,则应复制 C 字符串或使用 getCString:maxLength:encoding: 。

我认为 cStringUsingEncoding 正在为转换后的字符串分配内存到指定的编码,并且您不保留接收器,因此如果您不使用自动释放池,则该内存永远不会被释放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发现内存泄漏问题 cStringUsingEncoding 的相关文章

  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • iPhone / iPad IOS 应用程序仪器内存计数与 task_info 内存计数

    我一直在使用 Instruments Leak Tester 它给出了大约 1 3 meg 的应用程序总分配数字 但是 当使用 task info 时 它会报告更大的内存量 例如 10 20 meg 我想我只是想确认task info正在返
  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个

随机推荐

  • 是否可以在单手柄 jQuery UI 滑块上设置固定的静态范围?

    本质上我要做的是一个用于一堆日期的单句柄 jQuery UI 滑块 选择的日期范围始终为两周 我想做的只是显示从两周范围的开始日期 即句柄驻留的日期 开始的一个范围 该范围不必是功能性的 只是显示 向前两周 这个范围是固定的 例如 如果句柄
  • 从 Eclipse 远程部署 Tomcat Web 应用程序

    出于开发和测试目的 我想将我的 web 应用程序从 eclipse 部署到远程 tomcat 服务器 这可能吗 如果没有 我应该如何设置我的开发环境以实现顺利 轻松的远程部署 如果您可以远程访问 Tomcat 管理器应用程序 那么您可以使用
  • 让用户选择他希望程序使用多少个线程

    我想让一个程序读取 txt 文件的每一行 并对每一行执行一些操作 我希望用户能够选择线程 因此如果他选择 10 个线程 那么程序将能够同时在 10 行上执行某些操作 假设文本文件包含 1 000 000 行 我该怎么办 这就是我实际上所拥有
  • 如何确定 connectNative 是失败还是成功

    我已成功将我的扩展连接到我们的本机主机 var pulse tracker port chrome runtime connectNative com cloudfactory pulsetracker 但我如何知道连接是否成功呢 无论连接
  • Xcode 5“缺少编译器规范 LLVM 4.2”错误

    我目前正在尝试在 Xcode 5 中构建我的项目 构建失败并出现错误 依赖性分析错误 missing compiler specification
  • 抽象工厂设计模式

    我正在为我的公司开发一个内部项目 该项目的一部分是能够将 XML 文件中的各种 任务 解析为稍后运行的任务集合 由于每种类型的任务都有许多不同的关联字段 因此我决定最好用单独的类来表示每种类型的任务 为此 我构造了一个抽象基类 public
  • 输入上的 v-model 通过其他脚本动态更改值?

    我有两个输入 用于存储来自谷歌地图脚本的纬度和经度 如果用户更改标记的位置 gt 这两个输入将获取用户所啄的纬度和经度 所以我想获取这两个输入的值 我尝试了 v model 但它不起作用我实际上注意到 只有当我通过键入或粘贴某些内容来更改这
  • CMD.EXE 批处理脚本显示 txt 文件中的最后 10 行

    有什么想法如何回显或输入 txt 文件的最后 10 行吗 我正在运行服务器更改日志脚本来提示管理员说明他们正在做什么 以便我们可以跟踪更改 我试图让脚本显示最近 10 个条目左右 以了解最近发生的情况 我找到了一个处理最后一行的脚本 如下所
  • Android 从gridview布局索引转换成行和列

    如果我有从 0 开始的网格上位置的索引 如何将其转换为行 列 我得到以下错误结果 幸运的是 我知道我有多少行和列 在我的例子中是 11 x 11 int column position columns int row position co
  • 每个服务端点的 HttpClient 实例化

    实例化 HttpClient 时 一个常见的建议是 使用单例 每次使用后不要丢弃 https stackoverflow com questions 22560971 what is the overhead of creating a n
  • 将 Angular-Seed Jasmine 单元测试转换为 CoffeeScript

    作为练习 我正在尝试转换包含在angular seed从 js 回购到咖啡脚本 特别是 我遇到了问题tests unit directivesSpec js测试集 定义了一个简单的价值服务 这是我的咖啡脚本代码 1 describe dir
  • 如何检测 Gradle 构建是否正在 TeamCity 上运行?

    一些日志消息 https www jetbrains com help teamcity service messages html我的构建脚本中的内容仅当 Gradle 构建在 TeamCity 上运行时才相关 如何以编程方式检测 Gra
  • OLE DB 提供程序“Search.Collat​​orDSO”返回“命令未准备好”

    有人能够使用 OLE DB 提供程序在 SQL Server 中进行搜索来连接到 Windows 搜索服务吗 下面您将看到我在 Management Studio 中配置链接服务器时不断遇到的错误消息 链接服务器 TESTSERVER 的
  • 无序列表

    就 SEO 和可访问性而言 ul 这是构建简单导航菜单的好方法吗 作为参考 我尝试通过 Lynx 测试我的所有网站 只是为了帮助确保可访问性 并且 ul 就 Lynx 中的显示而言 s 似乎是最充分的 但这真的可以用作 SEO 的良好经验法
  • C++ ABI 如何处理 RVO 和 NRVO?

    我对编译器和链接器如何处理调用要求这一事实感到困惑er该功能的不同取决于该功能是否使用 RVO 还是 NRVO 这可能是我的误解 但我的假设是通常没有 RVO 或 NRVO std string s get string 如果 get st
  • 快速错误“Domain=NSCocoaErrorDomain Code=3840“字符 1 周围的值无效。”

    我在修复 Swift Alamofire POST 请求 登录用户 上的此错误消息时遇到问题 3840 字符 1 周围的值无效 我导入了粉底 阿拉莫菲尔 斯威夫特 杰森 没有授权限制 没有 Oauth 等 当我更改帖子 例如 使用其他参数和
  • 选择每隔一个可见的表格行

    我有一个显示树结构的表格 超级类别和子类别 当用户单击超类别时 子类别的显示属性将被切换 现在我想在每两个表格行上添加交替背景颜色 但当然只考虑当前可见的那些 下面是结构的简化示例 table tr td Super 1 td tr tr
  • jquery如何检查url是否包含word?

    我希望能够检查 url 是否包含 目录 一词 这就是我正在尝试的 document ready function if window location href indexOf catalogue trail toggle 该网站的网址可能
  • ViewChild 和 focus()

    我有一个包含默认隐藏文本区域的组件 div class action ui g 2 edit div
  • 发现内存泄漏问题 cStringUsingEncoding

    嘿 我正在尝试使用 cStringUsingEncoding 将 NSString 转换为 C 字符串 但出现内存泄漏 我的理解是 cStringUsingEncoding 返回一个指向字符数组的指针 该数组仅保证在 NSString 对象