我在共享库中具有以下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
函数返回的内存的正确方法是什么?
[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
模块(由Foundation
,AppKit
或UIKit
导入)的一部分从标准C库中导入。在Linux上,您将import Glibc
。