方法缓存已损坏。这可能是对无效对象的消息,也可能是其他地方的内存错误

时间:2015-01-12 18:09:51

标签: c sdl

我正在为一个名为turtles的uni项目编写一个程序,用户基本上将一系列命令输入到文本文件(前30,右20等)中,然后程序相应地绘制线条。我收到一条非常奇怪的错误信息,并且几乎找不到它可能出现的线索。这是错误消息(并不总是出现,有时只是seg错误):

objc[2139]: Method cache corrupted. This may be a message to an invalid object, or a memory error somewhere else.
objc[2139]: unused 0x0, SEL 0x7fff8eb29c08, isa 0x7fff743d7c90, cache 0x7fff743d7ca0, buckets 0x10020c990, mask 0x3, occupied 0x1, wrap bucket 0x10020c990
objc[2139]: unused 0 bytes, buckets 64 bytes
objc[2139]: selector 'initialize'
objc[2139]: isa 'NSOrderedSet'
objc[2139]: Method cache corrupted.

当程序退出时,Xcode指向以下代码:

SDL_Window *window = SDL_CreateWindow("Turtles", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);

在此功能中:

/**
 Create SDL window and handle errors
 */
SDL_Window *createWindow() {

    SDL_Window *window = SDL_CreateWindow("Turtles", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);

    /*window = SDL_CreateWindow("Turtles", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);*/

    if(window == NULL) {
        fprintf(stderr, "Failed to create window\n");
        exit(EXIT_FAILURE);
    }

    return window;
}

我不认为这个功能有问题,因为我以前曾经无数次使用它。关于真正的问题可能在哪里,我没有其他线索。我花了几个小时看着程序中的每一行,并使用printf来尝试解决它,但没有运气......

这是完整程序的链接(编辑:新链接,修复了指出的一些错误):

https://github.com/mtalu/turtles/commit/5bb499bfe80fe780bb1f632adee44e9a3df2d369

(两个c文件和一个输入文本文件)

如果有任何关于如何诊断这一问题的帮助/建议,将不胜感激,谢谢!

4 个答案:

答案 0 :(得分:2)

分配的内存不足。在函数getToken()中,您可以像这样分配内存:

char *token = (char *) myMalloc(strlen(tempToken) * sizeof(char), "getToken");

或者这个:

char *token = (char *) malloc(strlen(tempToken) * sizeof(char));

然后复制字符串

strcpy(token, tempToken);

但分配的内存不允许使用0字符串终结符。我建议你仔细查看剩下的代码,看看是否有其他内存分配不足的实例。

顺便提一下,在myMalloc()中为什么要将malloc()返回的void指针强制转换为void指针?在任何情况下,您都不应该转换malloc()的返回值。

答案 1 :(得分:1)

你在main.c中的

以下是第一次调用代码::

printf("Creating display\n");
Display *d;
d = getDisplay(d);

在你的my_sdl_setup.c

Display *getDisplay(Display *newDisplay) 
{
    printf("Creating static display pointer\n");
    static Display *d;

    if(newDisplay) {
       printf("New display object provided, initializing!\n");
       printf("Mallocing space for display pointer\n");
       d = (Display *) malloc(sizeof(Display));
       if(d == NULL) {
          printf("Malloc failed in getDisplay\n");
       }

       printf("Initializing SDL\n");
       initializeSDL();
       .....
    }

    return d;
}       

如果是main.c的

Display *d;

如果是这种情况,您希望编译器自动将d初始化为NULL。 那么你的代码在初始化SDL时效果很好。 但d未初始化,但不是0(或NULL) 那么你的SDL Init就不会调用正确的时间。

另外,您的问题是关于Graphix Init问题。和日志。 所以,首先要检查这个问题。

它与调试模式或发布模式不同。

答案 2 :(得分:0)

事实证明问题是我没有正确使用realloc:

我刚改变了: tokens =(char **)realloc(tokens,sizeof(char *));

要:

tokens =(char **)realloc(tokens,sizeof(char *)*(* numberOfTokens + 1));

现在,幸运的是,一切正常。

无论如何为所有回复干杯!

答案 3 :(得分:-2)

我建议显示设置是否正常? github链接代码,

Display *d;
+    d = getDisplay(d);

如果* d未初始化良好 所以你会尝试

Display *d = NULL; 

并尝试一下。