如何解决我分配并初始化了我的结构,但无法释放它
我做了这样的结构
// structure of window
typedef struct s_window{
void *mlx_ptr;
void *win_ptr;
int width;
int height;
int color_floor;
int color_ceiling;
t_map *map;
t_key *key;
t_player *player;
} t_window;
我通过这个函数分配内存和初始化
int alloc_window(t_window **window)
{
(*window) = (t_window *)malloc(sizeof(t_window));
if (!(*window))
return (ERROR);
(*window)->map = (t_map *)malloc(sizeof(t_map));
(*window)->key = (t_key *)malloc(sizeof(t_key));
(*window)->player = (t_player *)malloc(sizeof(t_player));
if (!(*window)->map || !(*window)->key || !(*window)->player)
{
free_window(window);
return (ERROR);
}
return(SUCCESS);
}
void init_window(t_window *window)
{
window->width = 800;
window->height = 600;
window->player->x = 5;
//window->mlx_ptr = mlx_init();
//window->win_ptr = mlx_new_window(window->mlx_ptr,window->width,window->height,"cub3d");
}
我正试图通过这个函数来释放这个结构。我尝试了编写和注释函数,但它们都没有释放任何结构。
/*
void free_window(t_window *window)
{
printf ("before freeing... %d,%d,%f\n",window->player->x);
if (window->map)
free(window->map);
if (window->key)
free(window->key);
if (window->player)
free(window->player);
free(window);
printf ("after freeing... %d,window->player->x);
}
*/
void free_window(t_window **window)
{
printf ("before freeing... %d,(*window)->width,(*window)->height,(*window)->player->x);
if ((*window)->map != NULL)
free((*window)->map);
if ((*window)->key != NULL)
free((*window)->key);
if ((*window)->player != NULL)
free((*window)->player);
free((*window));
printf ("after freeing... %d,(*window)->player->x);
}
编译器说没有错误,这让我更困惑。
解决方法
释放时不会清除内存。释放内存后读取内存是未定义的行为,所以不要这样做。但是如果你传递了一个有效的指针或一个 NULL 指针,free
就不会真正失败。或者好吧,没有办法测试它。
我预计会出现分段错误
这不是一个正确的期望。这是一个可能的结果,但不能保证。
此外,我建议返回一个指针而不是一个整数。为错误返回 NULL 指针是惯用的。我建议删除强制转换并使用 sizeof 变量。这是一个修改后的版本,可以在发生任何故障时正确释放所有内容。
t_window *alloc_window(void)
{
t_window *window = malloc(sizeof(*window));
// Extra variables for readability
t_map *map = malloc(sizeof(*map));
t_key *key = malloc(sizeof(*key));
t_player *player = malloc(sizeof(*player));
if(!map || !key || !player || !window) {
// It's ok to free a NULL pointer
free(map);
free(key);
free(player);
free(window);
return NULL;
}
window->map = map;
window->key = key;
window->player = player;
return window;
}
,
@klutt 的 answer 已经解释过了。只是添加 -
C 语言不提供内存保护机制。这意味着,在动态分配内存的上下文中,用户可以在执行期间的任何时候使用内存地址访问它。内存地址是否空闲不能通过访问来确认。
一般来说,alloc()
和 free()
不会对内存进行任何读/写(reset
)操作,也不会将其标记为有效/无效。它唯一的一种记录方式来跟踪自由记忆。当用户在先前分配的内存上调用 free()
时,该地址只会被添加到空闲地址列表中。用户有责任在释放后不访问无效或悬空的内存地址。这就是为什么在释放地址后将地址标记为 NULL
的好做法,这样您就不会错误地读取垃圾值。
如果您需要验证您的程序是否正确分配/释放/使用内存,您可以使用valgrind 之类的工具。他们真的很有帮助。在您的示例中,该工具将清楚地显示您在释放后对内存的读取访问无效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。