指针/malloc()在指针值的if检查时发生奇怪的崩溃

指针/malloc()在指针值的if检查时发生奇怪的崩溃,c,pointers,C,Pointers,我在这里遇到了一些非常奇怪的崩溃,我以前遇到过,但我想我通过在变量声明中添加=NULL来修复它: #include <stdlib.h> ... GLuint *TEX = NULL; int TEX_MEMSIZE = sizeof(GLuint)*1024*1024; ... void something1(){ ... TEX = (GLuint *)malloc(TEX_MEMSIZE); ... } void something2(){

我在这里遇到了一些非常奇怪的崩溃,我以前遇到过,但我想我通过在变量声明中添加=NULL来修复它:

#include <stdlib.h>

...

GLuint *TEX = NULL;
int TEX_MEMSIZE = sizeof(GLuint)*1024*1024;

...

void something1(){
    ...
    TEX = (GLuint *)malloc(TEX_MEMSIZE);
    ...
}

void something2(){
    ...
    // this line runs fine.
    if(TEX != NULL){ // CRASH ON THIS LINE OF CODE
        // wont run anything after the above line.
        free(TEX);
    }
    // ...nor here since it crashed...
    ...
}
#包括
...
GLuint*TEX=NULL;
int-TEX_MEMSIZE=sizeof(GLuint)*1024*1024;
...
使某物无效1(){
...
TEX=(GLuint*)malloc(TEX_MEMSIZE);
...
}
使某物无效2(){
...
//这条线走得很好。
如果(TEX!=NULL){//在这行代码上崩溃
//不会在上面的线之后运行任何东西。
免费(特克斯);
}
//…自从它坠毁后也不在这里了。。。
...
}
它在我的笔记本电脑/vista上崩溃,但在台式电脑/winXP上没有

当我删除if check和free()时,它将不再崩溃

我就是不明白,我做错了什么?这是什么原因造成的?我只知道不正确的预定义数组会导致一些不合逻辑的错误,我不相信我的代码中现在有这样不正确的数组,所以我在等待更多的想法。(因为检查20k行代码也可能非常慢)

编辑:现在我注意到它不会在free()之前崩溃,而是在free()之后崩溃。我开始思考一些预定义的数组问题。。。因为碰撞的位置正在改变。(或者我只是得了痴呆症)


编辑2:修复了,在malloc()之前和之后有两个free()调用。\u>我现在觉得自己太愚蠢了。

如何定义TEX\u MEMSIZE

应该是这样的:

#define NUM_ENTRIES 50
#define TEX_MEMSIZE NUM_ENTRIES * sizeof(GLuint)

TEX\u MEMSIZE是如何定义的

应该是这样的:

#define NUM_ENTRIES 50
#define TEX_MEMSIZE NUM_ENTRIES * sizeof(GLuint)

根据给定的数据,并假设程序是多线程的,if(TEX!=NULL)检查和free之间可能存在争用条件,这可能导致NULL指针上出现free。您可能需要检查它。

根据给定的数据,并假设程序是多线程的,if(TEX!=NULL)检查和free之间可能存在争用条件,这可能会导致NULL指针上出现free。您可能想检查一下。

假设TEX确实是指针类型(意味着您没有在更局部的范围内重新声明它),那么

如果(TEX!=NULL){

如果访问TEX导致无效内存访问,则可能导致崩溃。由于TEX是一个全局变量,因此它在无效内存中的唯一方式是定义TEX的DLL未加载到进程中。在if语句之前放置一个断点,并验证包含TEX声明的DLL是否加载到进程中

当然,如果您有调试器,您可能会告诉我们未处理的异常类型是什么

睡眠(60*1000*X)


在IF语句之前,使用Windows Internal的“Process Explorer”实用程序(现在由Microsoft分发)查看进程中加载了哪些模块。将“X”设置为执行此操作所需的分钟数,2或3分钟就足够了。

假设TEX确实是指针类型(意味着您不需要在更局部的范围内重新声明它),这是

如果(TEX!=NULL){

如果访问TEX导致无效内存访问,则可能导致崩溃。由于TEX是一个全局变量,因此它在无效内存中的唯一方式是定义TEX的DLL未加载到进程中。在if语句之前放置一个断点,并验证包含TEX声明的DLL是否加载到进程中

当然,如果您有调试器,您可能会告诉我们未处理的异常类型是什么

睡眠(60*1000*X)


在IF语句之前,使用Windows内部构件的“Process Explorer”实用程序(现在由Microsoft分发)要查看过程中加载了哪些模块。请将“X”设置为执行此操作所需的分钟数,2或3分钟就足够了。

在所有位置重复相同的TEX!=NULL测试,在malloc之后肯定会正常;稍后肯定会断开

在所有的“…”代码中不断重复测试。最终,您会发现它在x行之前工作,但在x行之后不工作。这将指出问题所在


或者您的调试符号错误,崩溃没有发生在您认为的地方。关闭VS,重新打开,全部重建,然后重试

重复相同的TEX!=NULL测试,在malloc之后肯定会正常;稍后肯定会崩溃

在所有的“…”代码中不断重复测试。最终,您会发现它在x行之前工作,但在x行之后不工作。这将指出问题所在


或者您的调试符号错误,并且崩溃没有发生在您认为的地方。关闭VS,重新打开,全部重建,然后重试

我的水晶球说您需要做的就是

#include <stdlib.h>
另外,您假设
sizeof(int)
除以
TEX\u MEMSIZE
。您想要
TEX\u MEMSIZE
字节还是
TEX\u MEMSIZE
int
s?如果后者,您需要在
malloc()调用中乘以
sizeof(int)

TEX = malloc(TEX_MEMSIZE * sizeof *TEX);

您还应该更改
TEX\u MEMSIZE
的类型。在C中,
int
只保证存储值我的水晶球说您需要执行的操作

#include <stdlib.h>
另外,您假设
sizeof(int)
除以
TEX\u MEMSIZE
。您想要
TEX\u MEMSIZE
字节还是
TEX\u MEMSIZE
int
s?如果后者,您需要在
malloc()调用中乘以
sizeof(int)

TEX = malloc(TEX_MEMSIZE * sizeof *TEX);
您还应该更改
TEX\u MEMSIZE
的类型。在C中,
int
仅保证存储值 释放内存,但不更改指针。将其更改为

if (TEX != NULL)
{
    free(TEX);
    TEX = NULL;
}
因此,如果您第二次调用something2(),它将不会再次尝试释放(TEX)

释放内存,但不更改