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

时间:2012-08-01 22:12:43

标签: c++ string memory-leaks nsstring

我正在调用控制器字符串datamember并使用UTF8String方法将NSString对象转换为C ++字符串对象,这导致内存泄漏。调用是在核心音频RenderTone函数内进行的,如下所示:

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

代码位于for循环中,但它导致了相当大的内存泄漏。有什么想法吗?我必须进行转换,因为我正在使用cppTrackName变量进行c ++函数调用。我也试过这个: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 个答案:

答案 0 :(得分:2)

<强>更新

现在我已经看到了这条消息:

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

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

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