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

问题描述 投票:1回答:1

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

swift
1个回答
2
投票

[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模块(由FoundationAppKitUIKit导入)的一部分从标准C库中导入。在Linux上,您将import Glibc

© www.soinside.com 2019 - 2024. All rights reserved.