【问题标题】:Swift 5 : how to deallocate memory, allocated by shared librarySwift 5:如何释放由共享库分配的内存
【发布时间】: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函数返回的内存的正确方法是什么?

【问题讨论】:

    标签: swift


    【解决方案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 库中导入的,请参阅更新。
    • 非常感谢您的评论 - 这就是我想要的
    猜你喜欢
    • 1970-01-01
    • 2013-01-18
    • 2022-01-12
    • 1970-01-01
    • 2015-01-25
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多