代码之家  ›  专栏  ›  技术社区  ›  user393964

Objective-C到C++字符串转换导致内存泄漏

  •  2
  • user393964  · 技术社区  · 14 年前

    我正在调用一个控制器字符串数据成员,并使用 UTF8String 方法将NSString对象转换为C++字符串对象,这导致了内存泄漏。通话是在核心音频中进行的 RenderTone 函数,看起来如下:

    InstrumentGridViewController *viewController = (InstrumentGridViewController *)inRefCon;
    string cppTrackName = [viewController->trackName UTF8String];
    

    不过,代码位于for循环中,这导致了相当大的内存泄漏。有什么想法吗?我必须进行转换,因为我正在用 cppTrackName 变量我也尝试过: string cppTrackName = "synthTrack #1"; 这很好,不会造成任何泄漏,但显然我真的需要从我的控制器中读取值。

    这是控制台中的错误(不断重复):

    objc[6352]: Object 0x68c3b60 of class __NSCFData autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   justin    14 年前

    更新

    现在我看到了消息:

    实施 -[NSString UTF8String] 可以自由地假设在生成消息的线程上存在自动释放池。

    正在从辅助(渲染)线程调用音频回调。显然,在您发送字符串消息时,这个线程上不存在自动释放池,因此出现了“no autorelease pool”控制台消息。

    在典型的情况下,您会显式地创建一个自动释放池。 然而 ,这是渲染线程。如果它是实时音频线程,则不应锁定(包括堆分配),甚至不应使用objc消息传递(因为它可以锁定,而objc信息传递无法保证消息发送所需的最长时间)。ObjC API(实际上)在实时音频渲染上下文中没有位置。