Objective-C 插件因大型数组的初始化而崩溃
Posted
技术标签:
【中文标题】Objective-C 插件因大型数组的初始化而崩溃【英文标题】:Objective-C plugin crashes with initialization of large array 【发布时间】:2020-10-31 17:18:17 【问题描述】:我正在开发一个在 Osirix 中运行的 Objective-C 插件。在插件中的某个时刻,我初始化了两个大数组(它们旨在接受一个 512x512 的图像,该图像随后被输入到 CoreML 模型中)。原始插件使用了一个接受 200x200 大小图像的 coreml 模型,var IMG_SQSIZE 设置为 200^2,一切正常。现在我已将 IMG_SQSIZE 增加到 512^2 但这会使插件崩溃。如果我在没有崩溃后进行数组初始化和所有内容,如果我保留此行但在崩溃仍然存在后删除所有内容......所以我得出结论这是导致问题的原因。我是 Objective-C 和 X-code 的新手,但这似乎是一个内存问题。我想知道这是否是我需要在代码中分配的内存(它构建得很好),或者这是否是运行插件的程序的问题。任何建议都会很棒,谢谢
#define IMG_SQSIZE 262144 //(512^2)
double tmp_var[IMG_SQSIZE], tmp_var2[IMG_SQSIZE];
【问题讨论】:
它们是本地 C 数组吗?还是全球性的? 【参考方案1】:请注意,512^2 比 200^2 大很多,我怀疑这是内存问题。
您应该使用 malloc 分配内存并将代码移动到 C。这是我基于要求的建议 - 大量内存和双精度数组。如果你可以在这里使用浮点数甚至整数,它也会大大减少资源需求,所以看看这是否可行。
至少在 Objective-C 中这很容易做到,但您也应该将所有这些都包含在它自己的 autoreleasepool
中。
让我们先尝试简单的方法。看看以下是否有效。
// Allocate the memory
tmp_var = malloc( IMG_SQSIZE * sizeof( double ) );
tmp_var2 = malloc( IMG_SQSIZE * sizeof( double ) );
if ( tmp_var && tmp_var2 )
// ... do stuff
// ... see if it works
// ... if it crashes you have trouble
// ... when done free - below
else
// Needs better handling but for now just to test
NSLog( @"Out of memory" );
// You must to call this, ensure you do not return
// without passing here
free ( tmp_var );
free ( tmp_var2 );
编辑
这是另一个执行单个 malloc 的版本。不确定哪个会更好,但值得一试……如果内存不是问题,这个应该会更好。
// Supersizeme
tmp_var = malloc( 2 * IMG_SQSIZE * sizeof( double ) );
if ( tmp_var )
// This points to the latter portion
tmp_var2 = tmp_var + IMG_SZSIZE;
// ... do stuff
// ... see if it works
// ... if it crashes you have trouble
// ... when done free - below
else
// Needs better handling but for now just to test
NSLog( @"Out of memory" );
// You must to call this, ensure you do not return
// without passing here
free ( tmp_var );
另外,在这两种情况下,您都需要将变量定义为
double * tmp_var;
double * tmp_var2;
【讨论】:
以上是关于Objective-C 插件因大型数组的初始化而崩溃的主要内容,如果未能解决你的问题,请参考以下文章
大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败