当第一个指针被释放时,指向另一个指针的指针会发生什么?

5

我使用malloc创建了一个包含MAX个元素的数组并将其分配给指针,模拟了一个栈。然后我创建了第二个指针指向第一个指针,以便能够前后移动,执行push和pop操作。

int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;

最后,我使用`delete`删除包含数组的指针。
free (stack);

当我删除数组(stack)后,stack_ptr 指向一个没有内容的地址,对吗?

即使程序在恰好终止之后,这会导致内存泄漏或任何问题吗?


3
这并不是指向另一个指针的指针,而是从malloc中获取的指针的副本。只有一个内存块存在,您可以使用其指针的任何副本。重要的是您传递给“free”的,而不是它存储在哪个变量中。之后,无论存储在哪个变量中,都不得对指针进行解引用。 - Weather Vane
2
谷歌搜索“悬垂指针” - 不用担心 - 它是一个真正的计算机术语,并且适合工作场所使用;-) - John3136
1
free(stack_ptr) 也会释放该块。正如您在释放引用该块的指针后不使用 stack_ptr 访问堆一样,任何其他引用此块的指针都不能访问已释放的块。 - Ted D.
1
另一个指针的指针示例是 int ** stack_ptr = &stack; - Weather Vane
4个回答

2
删除数组(堆栈)后,stack_ptr指向一个没有内容的地址,对吗?
在执行“free(stack);”后,尝试执行“*stack_pt”是未定义行为(UB)。指向“stack_pt”的内容可能是好的、坏的、丑陋的或者只会导致代码崩溃。尝试找出这些内容是UB的。
这样做是否会导致内存泄漏或任何问题,即使程序恰好在终止之后?
在“stack_pt”中保留前一个有效指针的未更改副本本身不是泄漏也不是UB。只是不要使用“stack_pt”。
通常,在释放后,将指针设置为NULL是一种好的实践。
int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;
...
free (stack);
stack = NULL;
stack_ptr = NULL;

顺便提一句:建议分配给引用对象的大小,而不是类型,并避免不必要的强制转换。

// int * stack= (int *) malloc(MAX * sizeof(*stack));
int *stack =  malloc(sizeof *stack * MAX);

1
因为你复制了指针,所以没有内存泄漏。因此,指针stack_ptr指向未分配的空间。
如果你想在代码之后读取stack_ptr指向的内容,它将导致分段错误,因为你释放了malloc分配的空间。

1

https://en.wikipedia.org/wiki/Dangling_pointer

你尝试对其进行解引用时可能会出现段错误,但它是悬空的。尽管如此,没有内存泄漏。stack_ptr仍然在栈上,并且像普通的栈变量一样在函数返回时将被弹出。你正在释放它所指向的内存。

1

这不是指向指针,只是两者具有相同的值。第二个指针不会发生任何变化。它仍然具有相同的值,但这次它将引用未分配的内存。

这是指向指针的指针(ptr2):

int *ptr1;
int **ptr2 = &ptr1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接