尝试释放内存导致错误

时间:2012-03-21 13:55:48

标签: c malloc free

我已经声明了以下结构:

typedef struct _RECOGNITIONRESULT {
        int begin_time_ms, end_time_ms;
        char* word;
} RECOGNITIONRESULT;

有一种方法可以创建一个RECOGNITIONRESULT数组并填充它(仅用于测试目的):

void test_realloc(RECOGNITIONRESULT** p, int count){
    int i;
    *p = (RECOGNITIONRESULT *)realloc(*p, count * sizeof(RECOGNITIONRESULT));
    for (i = 0; i < count; i++){
        (*p)[i].begin_time_ms = 2*i;
        (*p)[i].end_time_ms = 2*i+1;
        (*p)[i].word=(char *) malloc ( (strlen("hello"+1) * sizeof(char ) ));
        strcpy((*p)[i].word,"hello");
    }
}

释放内存的方法是:

void free_realloc(RECOGNITIONRESULT* p, int count){
    int i = 0;
    if(p != NULL){
        if (count > 0){
            for (i = 0; i < count; i++){
                free(p[i].word);      //THE PROBLEM IS HERE.
            }
        }
        free(p);
    }
}

main方法调用这样的方法:

int main(int argc, char** argv)
{
    int count = 10;
    RECOGNITIONRESULT *p = NULL;
    test_realloc(&p,count);
    free_realloc(p,count);
    return 0;
}

然后,如果我尝试释放为&#34; word&#34;分配的内存,我会收到以下错误:

HEAP CORRUPTION DETECTED:在0x003D31D8的正常块(#63)之后。 CRT检测到应用程序在堆缓冲区结束后写入内存。

使用调试器我发现在调用free(p [i] .word)时会发生崩溃;

我做错了什么?我怎样才能释放他的记忆?

2 个答案:

答案 0 :(得分:4)

问题出在为word分配内存。 strlen("hello"+1)应为strlen("hello")+1

答案 1 :(得分:0)

因为你似乎在一次攻击中分配了一整套结构

RECOGNITIONRESULT **p;
*p = (RECOGNITIONRESULT *)realloc(*p, count * sizeof(RECOGNITIONRESULT));

你也可以通过一次免费电话来释放他们:

void free_realloc(RECOGNITIONRESULT *p, int count){
        free(p);
}

Chowlett发现strlen("hello"+1)也是错误的。

相关问题