我正在与运行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次,大约两个小时,或多或少。
我的问题是:在UnsafeRawPointer
到bindMemory
之后,是否需要为每个metrics_E0
解除分配/取消初始化内存?如果是,怎么样?
如果我不注意从内存中手动释放/取消初始化UnsafePointer
类型,会发生什么?
答案 0 :(得分:1)
bindMemory
不会更改已分配内存的所有权,它的目标是让您在内存的内容中达到峰值。除非在C ++库的文档中指定您需要手动释放接收的指针,否则您不必担心这一点。
如果您想确定,可以进行一些内存分析,并监视应用程序的内存使用情况。或者,如果您可以访问C ++代码,则可以在m16b_to_mE0
函数上设置断点并遍历堆栈跟踪,直到到达C ++区域,然后使用发送到方法的指针检查稍后会发生什么
请注意,释放该缓冲区的内存可能需要一些用于解除分配的库专用函数,而不是标准函数,但是这应该在库文档中指定。