首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法缓存已损坏。这可能是发送给无效对象的消息,也可能是其他地方的内存错误

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

Stack Overflow用户
提问于 2015-01-13 02:09:51
回答 4查看 3.3K关注 0票数 3

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

代码语言:javascript
运行
复制
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指向以下代码:

代码语言:javascript
运行
复制
SDL_Window *window = SDL_CreateWindow("Turtles", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);

在此函数中:

代码语言:javascript
运行
复制
/**
 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文件和一个输入文本文件)

如果您能帮助/建议我诊断这个问题,我将不胜感激,谢谢!

EN

Stack Overflow用户

发布于 2015-01-13 03:43:47

在你的main.c中

下面是第一个调用代码::

代码语言:javascript
运行
复制
printf("Creating display\n");
Display *d;
d = getDisplay(d);

在你的my_sdl_setup.c中

代码语言:javascript
运行
复制
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的

代码语言:javascript
运行
复制
Display *d;

在这种情况下,您希望编译器自动将d初始化为NULL。然后,您的代码将在初始化SDL时工作得很好。但d未初始化,但不是0(或NULL),则您的SDL Init将不会调用正确的时间。

另外,你的问题是关于Graphix Init的问题。还有木头。所以,首先检查这个问题。

这是不同于调试模式或发布模式的编译器。

票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27908200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档