【问题标题】:Freeing memory, functions释放内存、函数
【发布时间】:2014-03-29 01:11:06
【问题描述】:

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

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);
}

我在那个函数中分配了内存,但现在我试图在不同的函数中释放这个分配的内存,例如我的主函数。我该怎么做?

【问题讨论】:

  • 在一个函数中分配内存并在另一个函数中释放它是有问题的。你不能在你的 Main 函数中分配它,将分配的内存传递给你的另一个函数,然后在你返回 Main 后再次释放它吗?
  • 该函数的奇怪之处在于您声明了两个指针,但实际上只使用了newRecord 指针。然而,在将其设置为NULL 后,您返回未使用的指针。结果是该函数总是返回NULL,并且对新分配的内存不做任何事情。该函数可能应该返回newRecord
  • @Dour:你真的是那个意思?您将如何构建任何抽象?
  • 可以malloc 在一个地方,free 在另一个地方。
  • 如果我释放一个结构的元素,它还能工作吗?

标签: c linked-list malloc


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你确定吗?您可以按值将指针传递给另一个函数,然后在另一个函数中释放指针。至关重要的是,您不要在原始函数中再次使用指针。同样,您可以将分配的指针返回给调用函数,调用函数可以安排释放指针。所以,我不认为你的说法是准确的。
    • 我已经在我的代码中使用了这种类型的东西,如果你传递了该指针的引用,它会从另一个函数中释放内存。
    • 你是说这段代码不起作用:void allocator(size_t size) { void *vp = malloc(size); releaser(vp); }void releaser(void *vp) { free(vp); }?指针按值从allocator() 传递到releaser(),但releaser() 可以释放它。或者您是否在考虑 void int_alloc(size_t n) { int *data = malloc(n * sizeof(*data)); int_free(data[0]); } 之类的东西,其中无法写入 int_free() 来释放作为参数传递的整数?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2020-07-22
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多