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

Objective-C to C++ string conversion causing memory leak

本文关键字:内存 泄漏 转换 C++ 字符串 Objective-C      更新时间:2023-10-16

我正在调用一个控制器字符串数据成员,并使用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

更新

现在我看到了消息:

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

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

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