显然分配内存并正确释放它但程序仍然崩溃

时间:2016-11-25 02:55:56

标签: c memory heap-memory

所以我遇到了一个奇怪的问题而且似乎无法解决它。我有一个名为TEAM的ADT:

typedef struct Team {
    char *name;
    int points;
    int matches_won;
    int goal_difference;
    int goals_for;
}TEAM;

我创建了一个函数来初始化具有给定名称的TEAM *类型的变量:

TEAM *createTEAM (char *name){
    int error_code;

    if (name != NULL){
        if(strcmp(name, "") != 0){
            TEAM *new_team = (TEAM*)malloc(sizeof(TEAM));
            new_team->name = (char*)malloc(sizeof(char)*strlen(name));

            strcpy(new_team->name, name);
            new_team->points = 0;
            new_team->matches_won = 0;
            new_team->goal_difference = 0;
            new_team->goals_for = 0;

            return new_team;
        }else{
            error_code = EMPTY_STRING_CODE;
        }
    } else {

        error_code = NULL_STRING_CODE;
    }

    printf("Erro ao criar time.\n");
    printError(error_code);
    return NULL;
}

我还创建了一个正确删除其中一个TEAM *变量的函数:

void deleteTEAM (TEAM *team_to_remove){
    free(team_to_remove->name);
    team_to_remove->name = NULL;
    free(team_to_remove);
    team_to_remove = NULL;
}

但是当我创建的一个或多个测试函数(例如下面的代码)运行时,程序有时会崩溃,有时候不会崩溃。我注意到,更改我使用的名称会影响它是否崩溃,即使它们不会影响测试结果。

int create_team_01(){
    int test_result;
    TEAM *Teste = createTEAM("Cruzeiro");

    if (strcmp(Teste->name, "Cruzeiro") == 0){
        test_result = TRUE;
    }else test_result = FALSE;

    _assert(test_result); //just a macro function that will check the argument and return 1 if it's false

    deleteTEAM(Teste);
    return 0;
}

我没有看到内存分配或释放的任何问题。尽管如此,调试器仍然抱怨deleteTEAM函数的第一个free()(无法找到边界)。有任何想法吗?非常感谢您提供任何帮助。

P.S。:我甚至试过检查mallocs'结果,但它似乎也不是问题,所以我为了简单起见删除了它。

0 个答案:

没有答案