The memory leak happens very slowly, but could be worth fixing for some use cases.
Just 2 minor changes
Location 1: iOS/Classes/Helpers/UIImageExtension.m
Issue: The normalize: method in the UIImageExtension class has a potential memory leak caused by not freeing allocated memory.
Leak Source: The rawBytes pointer is allocated memory using calloc but is never released.
Solution:
Free rawBytes: After processing the image data, free the memory allocated to rawBytes using free(rawBytes) before returning "normalizedBuffer"
- (nullable float*)normalize:(UIImage*)image withMean:(NSArray<NSNumber*>)mean withSTD:(NSArray<NSNumber>*)std {
...
....
free(rawBytes); // Add this line to fix memory leak
return normalizedBuffer;
}
Location 2: iOS/Classes/PyTorchMobilePlugin.mm
Issue: The memory leak occurs in the image prediction functionality (case 2 block) of the handleMethodCall:result: method in the PyTorchMobilePlugin class. The leak is caused by dynamically allocated memory that is not freed properly.
Leak Source: The leak is traced back to the UIImageExtension's normalize: method, which allocates memory for the input float array. This memory allocation is necessary for image processing but becomes a liability if not handled correctly.
Solution:
Here's the corrected section of the code:
case 2:
...
...
try {
NSArray<NSNumber*>* output = [imageModule predictImage:input withWidth:width andHeight: height];
result(output);
} catch (const std::exception& e) {
NSLog(@"PyTorchMobile: %s", e.what());
}
free(input); // // Add this line to fix memory leak
break;
... Rest of the code ...
The memory leak happens very slowly, but could be worth fixing for some use cases.
Just 2 minor changes
Location 1: iOS/Classes/Helpers/UIImageExtension.m
Issue: The normalize: method in the UIImageExtension class has a potential memory leak caused by not freeing allocated memory.
Leak Source: The rawBytes pointer is allocated memory using calloc but is never released.
Solution:
Free rawBytes: After processing the image data, free the memory allocated to rawBytes using free(rawBytes) before returning "normalizedBuffer"
...
....
free(rawBytes); // Add this line to fix memory leak
return normalizedBuffer;
}
Location 2: iOS/Classes/PyTorchMobilePlugin.mm
Issue: The memory leak occurs in the image prediction functionality (case 2 block) of the handleMethodCall:result: method in the PyTorchMobilePlugin class. The leak is caused by dynamically allocated memory that is not freed properly.
Leak Source: The leak is traced back to the UIImageExtension's normalize: method, which allocates memory for the input float array. This memory allocation is necessary for image processing but becomes a liability if not handled correctly.
Solution:
Here's the corrected section of the code:
case 2:
...
...
try {
NSArray<NSNumber*>* output = [imageModule predictImage:input withWidth:width andHeight: height];
result(output);
} catch (const std::exception& e) {
NSLog(@"PyTorchMobile: %s", e.what());
}
free(input); // // Add this line to fix memory leak
break;
... Rest of the code ...