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 库导入(由 FoundationAppKitUIKit 导入)。在 Linux 上,您可以使用 import Glibc

【讨论】:

free() 是内置函数吗? @Dmitry:它是从标准 C 库中导入的,请参阅更新。 非常感谢您的评论 - 这就是我想要的

以上是关于Swift 5:如何释放由共享库分配的内存的主要内容,如果未能解决你的问题,请参考以下文章

fork() 并释放所有分配的内存

dlclose() 后访问共享库分配的内存

RSS/PSS/VSZ

分配给通过 Python CTypes 从共享库导出的变量?

进程间通信 - 动态链接库中共享内存(利用DLL的2~3G的地址段空间)

共享内存实现上的 C++ 内存池:这种分配和释放方法是不是正确?