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 插件因大型数组的初始化而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在Objective-C中动态分配指向对象的指针数组?

大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败

对大型数组进行排序时出现快速排序错误

Objective-C 之字符串与数值

写入后 NSOutputStream 因访问错误而崩溃(Objective-c)

iOS Objective-C 应用程序因异常原因崩溃