gpt4 book ai didi

c - 分配内存并释放它们。我们应该将它们设置为 NULL 吗?

转载 作者:太空狗 更新时间:2023-10-29 15:49:07 26 4
gpt4 key购买 nike

gcc (GCC) 4.7.0
c89

你好,

我想知道我在这里的想法是否正确。当我使用 malloc 分配内存时。 malloc 将返回一个指向内存中某个大小的指针。

所以在我分配内存之前,所有指针的值都将为 NULL。

使用这段代码:

struct address *db_row = NULL;

db_row = malloc(sizeof(struct address));
db_row->name = malloc(sizeof(char) * 10);
db_row->email = malloc(sizeof(char) *10);

free(db_row->name);
free(db_row->email);
free(db_row);

在分配内存之前,我已经在 db_row 的 gdb 调试器中完成了此操作:

(gdb) p db_row
$20 = (struct address *) 0x0
(gdb) p *db_row
Cannot access memory at address 0x0

这是正确的,因为没有分配内存地址。分配内存后,当我执行相同操作时,会得到以下信息:

(gdb) p db_row
$25 = (struct address *) 0x602310
(gdb) p *db_row
$26 = {id = 0, set = 0, name = 0x0, email = 0x0}

然而,在我释放内存之后,我仍然得到相同的内存地址,在分配任何内存之前,它不应该像第一种情况那样为 NULL 吗?

释放内存后:

(gdb) p db_row
$28 = (struct address *) 0x602310
(gdb) p *db_row
$27 = {id = 6300480, set = 0, name = 0x602330 "", email = 0x602350 " #`"}

如您所见,它仍然指向相同的内存位置,这是正确的吗?

最后,我在最后添加了这个,看看我是否可以做一个双重免费:

if(db_row != NULL) {
free(db_row);
}

if(db_row != NULL) {
free(db_row);
}

我在第二次调用 free 时得到一个堆栈转储。但作为一项安全措施,您是否应该始终检查以确保您没有尝试进行双重释放?

是否值得在释放指针后将指针设置为 NULL?

db_row = NULL;

非常感谢您的任何建议,

最佳答案

But as a safety measure should you always check to make sure you are not trying to free a NULL pointer?

使用NULL 指针调用free() 是安全的,不会发生任何事情。调用 free() 不会NULL 指针,您可以明确地这样做。 NULL在调用 free() 后设置一个指针将防止对相同指针变量的双重释放:

/* Assuming 'db_row' is referring to a valid address
at this stage the following code will not result
in a double free.*/
free(db_row);
db_row = NULL;
free(db_row);

如果另一个指针变量指向相同的地址并传递给 free(),则仍然会发生双重释放。

仅仅因为一个指针不是-NULL 并不能保证它指向一个有效的地址。确保不会出现双重 free() 是程序员的责任。在调用 free()NULLing 指针变量有帮助,但不能提供保证,因为多个指针变量可以指向同一地址。


But as a safety measure should you always check to make sure you are not trying to do a double free?

无法通过查询指针变量来确定其所在地址处的内存是否已被free()d。指针变量仅包含一个地址。

关于c - 分配内存并释放它们。我们应该将它们设置为 NULL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12493258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com