释放内存,功能

时间:2014-03-29 01:11:06

标签: c linked-list malloc

我试图释放我在另一个函数中的一个函数中分配的一些内存。这方面的一个例子是:

MusicRec * createRecord(char * title, char * artist, double fileSize, int length, char theType)
{
MusicRec * newRecord;
MusicRec * next;

newRecord = malloc(sizeof(MusicRec));
newRecord->title = malloc(sizeof(char)*(strlen(title))+1);
strcpy(newRecord->title, title);
newRecord->artist = malloc(sizeof(char)*(strlen(artist))+1);
strcpy(newRecord->artist, artist);
newRecord->sizeInKB = fileSize;
newRecord->lengthInSeconds = length;
newRecord->type = theType;
newRecord->next = NULL;
next = NULL;
return(next);
}

我在该函数中有malloced内存,但现在我试图在不同的函数中释放这个malloced内存,例如我的main函数。我该怎么做?

2 个答案:

答案 0 :(得分:1)

只需使用相应的释放函数free()请记住,你根本不能使用已经释放的内存。

需要考虑的一些要点:

  • 更好地更改内存分配方式,以便更轻松地更改类型:
    • 是:newRecord = malloc(sizeof(MusicRec));
    • 应该是:newRecord = malloc(sizeof *newRecord);
  • 考虑为您经常做的事情定义一些辅助函数。示例(此函数通常已经定义):
    • 是:newRecord->title = malloc(sizeof(char)*(strlen(title))+1);strcpy(newRecord->title, title);
    • 应该是:newRecord->title = strdup(title);
  • 永远不要使用sizeof(char):它看起来很文盲,因为你真的在问:我需要多少个字符来保存一个字符?

对于未定义的案例:

char* strdup(const char* str) {
    size_t len = strlen(str) + 1;
    char* ret = malloc(len);
    memcpy(ret, str, len);
    return ret;
}

答案 1 :(得分:0)

如果您已将该变量作为另一个函数的引用传递,则可以使用free()函数从该函数中释放该变量;否则,如果你已通过值传递,则无法从另一个函数中释放该变量。