首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在不同的函数中分配的空闲内存?

在不同的函数中分配的空闲内存?
EN

Stack Overflow用户
提问于 2012-06-17 20:11:31
回答 2查看 20.8K关注 0票数 67

我正在尝试学习C语言,目前我正在尝试编写一个基本的堆栈数据结构,但我似乎无法正确理解基本的malloc/free

下面是我一直在使用的代码(我只是在这里发布了一小部分来说明一个特定的问题,而不是全部代码,但错误消息是通过在valgrind中运行此示例代码而生成的)

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

typedef struct Entry {
    struct Entry *previous;
    int value;
} Entry;

void destroyEntry(Entry entry);

int main(int argc, char *argv[])
{
    Entry* apple;
    apple = malloc(sizeof(Entry));
    destroyEntry(*(apple));
    return 0;
}

void destroyEntry(Entry entry)
{
    Entry *entry_ptr = &entry;
    free(entry_ptr);
    return;
}

当我使用--leak-check=full --track-origins=yes通过valgrind运行它时,我得到以下错误:

代码语言:javascript
复制
==20674== Invalid free() / delete / delete[] / realloc()
==20674==    at 0x4028E58: free (vg_replace_malloc.c:427)
==20674==    by 0x80485B2: destroyEntry (testing.c:53)
==20674==    by 0x8048477: main (testing.c:26)
==20674==  Address 0xbecc0070 is on thread 1's stack

我认为这个错误意味着destroyEntry函数不允许修改main中显式分配的内存。是那么回事吗?为什么我不能在另一个函数中free我在main中分配的内存呢?(此行为是否特定于main?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-17 20:14:41

无论何时将参数传递给函数,都会创建一个副本,该函数将在该副本上工作。因此,在您的例子中,您试图free一个原始对象的副本,这没有任何意义。

您应该修改您的函数以接受一个指针,然后您可以让它直接在该指针上调用free

票数 52
EN

Stack Overflow用户

发布于 2012-06-17 20:16:04

这是通过值传递的,这意味着创建了副本,因此您尝试释放本地变量entry所在的内存。请注意,entry是一个具有自动存储持续时间的对象,当您的程序超出destroyEntry函数的作用域时,它所在的内存将自动释放。

代码语言:javascript
复制
void destroyEntry(Entry entry)
{
    Entry *entry_ptr = &entry;
    free(entry_ptr);
    return;
}

你的函数应该接受一个指针(通过引用传递):

代码语言:javascript
复制
void destroyEntry(Entry *entry)
{
    free(entry);
}

然后,您只需调用destroyEntry(apple);,而不是destroyEntry(*(apple));。请注意,如果没有与destroyEntry函数连接的其他功能,则它是多余的,最好直接调用free(apple)

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11071190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档