【问题标题】:iPhone app crashed for C++ codeiPhone 应用程序因 C++ 代码而崩溃
【发布时间】:2012-09-26 22:28:23
【问题描述】:

我编写了一个代码 sn-p 来为我的应用程序实现 LCS 算法。在这个算法中,我使用 malloc 实现了一个数组。但是,我不确定我是否做错了什么。我找不到任何显示原因的特定消息。我找不到出路。

注意:我开启了电弧

我的代码如下

- (IBAction)buttonAction:(id)sender
{
    [self getInlineDiffofFragment1:[NSArray arrayWithObjects:@"line1", @"line2", @"line3", @"line4", @"line5", nil] andFragment2:[NSArray arrayWithObjects:@"line1", @"line2", @"line4", @"line6", nil]];
}

- (void)getInlineDiffofFragment1:(NSArray*)fragment1 andFragment2:(NSArray*)fragment2
{
    int row = fragment1.count + 1;
    int col = fragment2.count + 1;
    int *lcs = (int*)malloc(sizeof(int) * row * col); //2d array
    NSString *str;
    for (int i = 0; i <= fragment1.count; i++) {
        lcs[i * row] = 0;
    }
    for (int j = 0; j <= fragment2.count; j++) {
        lcs[0 + j] = 0;
    }

    for (int i = 1; i < row; i++) {
        str = [NSString stringWithFormat:@""];
        for (int j = 1; j < col; j++) {
            int xy = i * row + j;
            if ([[fragment1 objectAtIndex:i - 1] isEqualToString:[fragment2 objectAtIndex:j - 1]]) {
                lcs[xy] = lcs[(i - 1) * row + (j - 1)] + 1;
            } else {
                lcs[xy] = MAX(lcs[(i - 1) * row + j], lcs[i * row + (j - 1)]);
            }
            str = [str stringByAppendingFormat:@"%d ", lcs[xy]];
        }
        NSLog(@"%@", str);
    }

    free(lcs);
    NSLog(@"freed");
}

该函数按预期完美打印结果并退出该块。结果如下所示

2012-09-26 16:14:18.727 TestDiff[56178:11303] 1 1 1 1 
2012-09-26 16:14:18.733 TestDiff[56178:11303] 1 2 2 2 
2012-09-26 16:14:18.734 TestDiff[56178:11303] 1 2 2 2 
2012-09-26 16:14:18.735 TestDiff[56178:11303] 1 2 3 3 
2012-09-26 16:14:18.736 TestDiff[56178:11303] 1 2 3 3 
2012-09-26 16:14:18.736 TestDiff[56178:11303] freed

打印结果并退出块后,它会崩溃。崩溃报告如下

程序对以下测试功能没问题

#define WIDTH 4
#define HEIGHT 5
#define INDEXOF(x,y) ((y*WIDTH) + x)

- (void)testArray
{
    NSString *str;
    int *myArray = (int *) malloc(sizeof(int) * 5 * 4);  // 4 * 5 array
    for(int x=0; x<WIDTH; x++){
        str = [NSString stringWithFormat:@""];
        for(int y=0; y<HEIGHT; y++){
            myArray[INDEXOF(x,y)] = y;
            str = [str stringByAppendingFormat:@"%d ", myArray[INDEXOF(x, y)]];
        }
        NSLog(@"%@", str);
    }
    free(myArray);
}

感谢您的帮助

【问题讨论】:

  • 你的代码没有问题,问题出在其他地方。

标签: c++ objective-c arrays malloc


【解决方案1】:

您是否尝试过在free(myArray); 的行上放置一个断点?它是否成功地达到了这一点,然后当你跨过它时崩溃?

另外,如果你得到 EXC_BAD_ACCESS,你应该试试turning zombies on 看看是否已经发布了一些东西。

【讨论】:

  • 我用free(lcs);测试了把断点放在行上,我按照你说的在你之后尝试了僵尸。在执行了几次函数后,它会显示一条错误消息 TestDiff(56896,0xac5482c0) malloc: *** error for object 0x8876224: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug 1 1 1 1 1 2 2 2 1 2 2 2 1 2 3 3 1 2 3 3 freed 2012-09-26 19:48:33.484 TestDiff[56896:11303] *** -[__NSSetM release]: message sent to deallocated instance 0x8876220lcs 是本地的,我在块的末尾释放了它
  • 是的。这是使用 ARC 的怪癖之一。我喜欢 ARC,但是当您在 ARC 中遇到这些 EXC_BAD_ACCESS 错误时,很难弄清楚,因为您从未明确调用 release。您是否打开了所有异常断点?如果没有,请先尝试这样做(请参阅stackoverflow.com/questions/9882999/…)。这通常会在发生的确切行上停止执行,这可能会有所帮助。否则,查看是否有任何对象持有可能导致问题的 NSSet。
【解决方案2】:

转到您的构建设置并查找名为“Compile Source As”的项目。将其值更改为“Objective C++”。

【讨论】:

  • “将源编译为”设置为“根据文件类型”。我按照你说的改了,到现在什么都没变。此外,我会将这个功能放到另一个项目中。所以,我无法永久更改该属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2010-11-14
  • 2023-03-14
  • 2019-12-26
  • 2012-05-28
相关资源
最近更新 更多