C 中的悬空指针
Dangling pointers in C
当使用 malloc 为指针分配内存时,指针(比如 x)现在将指向内存地址。
后来我释放了这个(x)内存指针,但指针仍然指向它的旧内存。
现在这将创建悬挂指针。
(因为我free后没有把旧指针指向NULL)
现在,假设我使用 malloc 并假设新指针 (y) 现在指向与旧指针 (x) 相同的内存位置
将新指针 (y) 设置为 0 不能解决悬挂指针问题。
假设我只有一个结构 type.So 我所做的每个 malloc 总是具有相同大小的相同结构。
如果它是不同的结构,我知道如果新指针 (y) 的内存分配比指针 (x)
小,我可能仍然在结构的末尾有一些数据
如果您在释放悬挂指针后尝试使用它们,那么它们只是一个问题。
是的,新分配可能 return 具有与 x
相同的地址。但是你永远不知道这是否会发生,所以你仍然不能再使用 x
了。如果它的地址再次有效,那只是巧合。
即使您一直分配和释放相同的大小,也不会期望它会继续重复使用相同的地址。
为了安全起见,您必须假设释放的指针永远不会再次有效。
术语悬空指针意味着它指向的内存中的任何地址都是无效的。如果你让它有效,就像你的第二个 malloc,那么地址就有效了。如果您将相同的地址存储在两个不同的变量中(根据您的假设),两者都是有效的指针:
#include <stdio.h>
#include <stdlib.h>
struct s { int i; };
int main() {
struct s *p = malloc(sizeof(struct s));
printf("before: %p\n", (void *) p);
free(p);
// p is dangling
printf("after: %p\n", p);
struct s *p2 = malloc(sizeof(struct s));
// p and p2 are valid
printf("before: %p\n", (void *) p2);
free(p2);
// p and p2 are dangling
printf("after: %p\n", p2);
}
以及我令人满意的 malloc 输出:
before: 0x561b73d3b260
after: 0x561b73d3b260
before: 0x561b73d3b260
after: 0x561b73d3b260
当使用 malloc 为指针分配内存时,指针(比如 x)现在将指向内存地址。 后来我释放了这个(x)内存指针,但指针仍然指向它的旧内存。 现在这将创建悬挂指针。 (因为我free后没有把旧指针指向NULL)
现在,假设我使用 malloc 并假设新指针 (y) 现在指向与旧指针 (x) 相同的内存位置 将新指针 (y) 设置为 0 不能解决悬挂指针问题。
假设我只有一个结构 type.So 我所做的每个 malloc 总是具有相同大小的相同结构。 如果它是不同的结构,我知道如果新指针 (y) 的内存分配比指针 (x)
小,我可能仍然在结构的末尾有一些数据如果您在释放悬挂指针后尝试使用它们,那么它们只是一个问题。
是的,新分配可能 return 具有与 x
相同的地址。但是你永远不知道这是否会发生,所以你仍然不能再使用 x
了。如果它的地址再次有效,那只是巧合。
即使您一直分配和释放相同的大小,也不会期望它会继续重复使用相同的地址。
为了安全起见,您必须假设释放的指针永远不会再次有效。
术语悬空指针意味着它指向的内存中的任何地址都是无效的。如果你让它有效,就像你的第二个 malloc,那么地址就有效了。如果您将相同的地址存储在两个不同的变量中(根据您的假设),两者都是有效的指针:
#include <stdio.h>
#include <stdlib.h>
struct s { int i; };
int main() {
struct s *p = malloc(sizeof(struct s));
printf("before: %p\n", (void *) p);
free(p);
// p is dangling
printf("after: %p\n", p);
struct s *p2 = malloc(sizeof(struct s));
// p and p2 are valid
printf("before: %p\n", (void *) p2);
free(p2);
// p and p2 are dangling
printf("after: %p\n", p2);
}
以及我令人满意的 malloc 输出:
before: 0x561b73d3b260
after: 0x561b73d3b260
before: 0x561b73d3b260
after: 0x561b73d3b260