2012-09-26 32 views
2

我写了一个代码片段来为我的应用程序实现LCS算法。在这个算法中,我使用malloc实现了一个数组。但是,我不确定我是否做错了什么。我找不到任何显示原因的具体信息。我找不到出路。iPhone应用程序崩溃的C++代码

注:我有

弧之下

- (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 

打印结果并退出块后崩溃。崩溃报告是继

enter image description here

该计划是确定了以下测试功能

#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); 
} 

感谢您的帮助

+0

你的代码没有错,这个问题在别的地方。 –

回答

1

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

此外,如果您获得EXC_BAD_ACCESS,您应该尝试turning zombies on并查看是否已经发布了某些内容。

+0

我用'free(lcs)'测试了放行点;'我在你之后尝试了僵尸。函数执行几次后,它显示一条错误消息 TestDiff(56896,0xac5482c0)对象0x8876224的malloc:***错误:释放对象的错误校验和 - 对象可能在释放后被修改。 ***设置断点在malloc_error_break调试释放 2012-09-26 19:48:33.484 TestDiff [56896:11303] *** - [__ NSSetM发布]:发送到释放实例0x8876220的消息' 但是'lcs'是本地的,我在块的末尾释放它 – Avigit

+0

是的。这是使用ARC的怪癖之一。我喜欢ARC,但是当你在ARC中遇到这些EXC_BAD_ACCESS错误时,由于你从不明确地调用release,所以很难找出它们。你是否打开了所有异常断点?如果没有,请尝试先做(请参阅http://stackoverflow.com/questions/9882999/how-can-i-catch-all-exceptions-in-ios-5)。这通常会在发生的确切行上停止执行,这可能会有所帮助。否则,请查看是否有任何可能导致问题的对象持有NSSet。 –

1

转到您的构建设置,并寻找所谓的“编译项目来源为'。将其值更改为“Objective C++”。

+0

“编译源为”设置为“根据文件类型”。我改变它,如你所说,迄今没有任何改变。此外,我将把这个功能放到另一个项目中。所以,我无法永久改变这个属性。 – Avigit