iOS UnsafePointer内存释放

时间:2018-03-27 14:20:16

标签: c++ objective-c swift allocation unsafe-pointers

我正在与运行C ++代码的硬件设备连接,并将每秒几十次的实时数据发送到iOS设备。

我有一个像这样的Swift方法:

func m16b_to_mE0(_ pointer: UnsafePointer<m16bytes_t>) -> UnsafePointer<metrics_E0>? {
     return UnsafeRawPointer(pointer).bindMemory(to: metrics_E0.self, capacity: MemoryLayout<metrics_E0>.size)
}

m16bytes_t

的位置
typedef uint8_t m16bytes_t[16];

metrics_E0

struct metrics_E0 {
    uint8_t   tag;
    uint8_t   hr;
    uint16_t  c_speed;
    uint16_t  c_max_speed;
    uint16_t  c_met_power;
    uint16_t  c_speed_intensity;
    uint16_t  c_hr_exertion;
    uint8_t   hr_avg;
    u3bytes_t c_acc_met_power; //typedef uint8_t u3bytes_t[3];
};

以上m16b_to_mE0方法每秒调用近10次,大约两个小时,或多或少。

我的问题是:在UnsafeRawPointerbindMemory之后,是否需要为每个metrics_E0解除分配/取消初始化内存?如果是,怎么样?

如果我不注意从内存中手动释放/取消初始化UnsafePointer类型,会发生什么?

1 个答案:

答案 0 :(得分:1)

bindMemory不会更改已分配内存的所有权,它的目标是让您在内存的内容中达到峰值。除非在C ++库的文档中指定您需要手动释放接收的指针,否则您不必担心这一点。

如果您想确定,可以进行一些内存分析,并监视应用程序的内存使用情况。或者,如果您可以访问C ++代码,则可以在m16b_to_mE0函数上设置断点并遍历堆栈跟踪,直到到达C ++区域,然后使用发送到方法的指针检查稍后会发生什么

请注意,释放该缓冲区的内存可能需要一些用于解除分配的库专用函数,而不是标准函数,但是这应该在库文档中指定。