Swift 5:如何取消分配由共享库分配的内存

时间:2019-11-26 15:21:44

标签: swift

我在共享库中具有以下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)") } 函数返回的内存的正确方法是什么?

1 个答案:

答案 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模块(由FoundationAppKit或{{1导入的)模块的一部分从标准C库导入的。 }})。在Linux上,您可以UIKit