我在共享库中具有以下C函数:
<iframe src="//fast.wistia.net/embed/iframe/#{#course.video}" allowtransparency=...
这就是我从Swift代码中调用它的方式: var rxData:UnsafeMutablePointer? =零
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;
}
释放let apiResponse = GetRxDataBlock(&rxData)
print("Rx data : ret = \(apiResponse)")
if let dataStr = rxData {
let rxStr = String(cString: dataStr)
print("Rx data = \(rxStr)")
}
函数返回的内存的正确方法是什么?
答案 0 :(得分:2)
malloc()
版本的内存必须与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
或{{1导入的)模块的一部分从标准C库导入的。 }})。在Linux上,您可以UIKit
。