Swift 5:如何释放由共享库分配的内存
Posted
技术标签:
【中文标题】Swift 5:如何释放由共享库分配的内存【英文标题】:Swift 5 : how to deallocate memory, allocated by shared library 【发布时间】:2019-11-26 15:21:44 【问题描述】:我在共享库中有以下 C 函数:
int GetRxDataBlock( char** data )
CHECK_FACADE_INITIALIZATION( "getRxDataBlock : Client facade not initialized", __LINE__ );
if ( data == nullptr )
printErrorMsg("getRxDataBlock : nullptr", __LINE__);
return -1;
int ret = 0;
try
std::string rxData = g_facade.value()->getRxDataBlock();
*data = (char*) malloc(rxData.size() + 1);
memset(*data, 0, rxData.size() + 1 );
memcpy(*data, rxData.c_str(), rxData.size());
catch(...)
ret = -1;
return ret;
这就是我从 Swift 代码中调用它的方式: var rxData: UnsafeMutablePointer? = 无
let apiResponse = GetRxDataBlock(&rxData)
print("Rx data : ret = \(apiResponse)")
if let dataStr = rxData
let rxStr = String(cString: dataStr)
print("Rx data = \(rxStr)")
释放GetRxDataBlock
函数返回的内存的正确方法是什么?
【问题讨论】:
【参考方案1】:malloc()
ed 内存必须用free()
释放:
if let dataStr = rxData
// do something with `dataStr`
// ...
free(dataStr)
这也是defer
的一个很好的用例,它在块的范围离开之前调用闭包:
if let dataStr = rxData
defer free(dataStr)
// do something with `dataStr`
// ...
在 Apple 平台上,free()
作为 Darwin
模块的一部分从标准 C 库导入(由 Foundation
、AppKit
或 UIKit
导入)。在 Linux 上,您可以使用 import Glibc
。
【讨论】:
free() 是内置函数吗? @Dmitry:它是从标准 C 库中导入的,请参阅更新。 非常感谢您的评论 - 这就是我想要的以上是关于Swift 5:如何释放由共享库分配的内存的主要内容,如果未能解决你的问题,请参考以下文章
分配给通过 Python CTypes 从共享库导出的变量?