Objective-C 插件在初始化大型数组时崩溃

Objective-C plugin crashes with initialization of large array

提问人:user3470496 提问时间:7/11/2020 更新时间:7/11/2020 访问量:55

问:

我正在开发一个在 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];
Objective-C Xcode 内存管理 插件 CoreML

评论

0赞 Kamil.S 7/17/2020
它们是本地 C 数组吗?还是全球性的?

答:

0赞 skaak 7/11/2020 #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;