我使用的是一个硬件设备,它运行C++代码,几乎每秒向iOS设备发送10次实时数据。
我有一个类似这样的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次,大约持续两个小时,或多或少。
我的问题是:在bindMemory到metrics_E0之后,是否需要为每个UnsafeRawPointer释放/取消初始化内存?如果是,是如何实现的?
如果我不注意从内存中手动释放/取消初始化UnsafePointer类型,会发生什么?
发布于 2018-03-27 23:03:15
bindMemory不会改变已分配内存的所有权,它的目标是允许您达到内存内容的峰值。除非在C++库的文档中指定需要手动释放接收到的指针,否则您不需要担心这一点。
如果您想要确定并监控应用程序的内存使用情况,您可以执行一些内存分析。或者,如果您可以访问C++代码,则可以在m16b_to_mE0函数上设置断点并遍历堆栈跟踪,直到到达C++区域,并检查稍后发送给您的方法的指针发生了什么情况。
请注意,释放该缓冲区的内存可能需要一些库专用函数来释放,而不是标准函数,但是这应该在库文档中指定。
https://stackoverflow.com/questions/49515403
复制相似问题