我使用 malloc 模拟了一个堆栈,以创建一个 MAX 元素数组并将其分配给指针。然后,我做了第二个指针指向第一个指针,以便能够来回导航,执行推送和弹出。
int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;
最后,我删除包含数组的指针,使用
free (stack);
删除数组(堆栈)后,stack_ptr指向一个没有内容的地址,对吧?
这会导致内存泄漏或任何类型的问题,即使程序在之后终止?
删除数组(堆栈)后,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);
没有内存泄漏,因为您复制了指针。因此,指针stack_ptr
指向未分配空间。
如果要读取代码后stack_ptr
指向的内容,则会导致分段错误,因为您释放了malloc分配的空间。
https://en.wikipedia.org/wiki/Dangling_pointer
如果您尝试取消引用它,您可能会也可能不会出现段错误,但它是悬而未决的。 不过没有内存泄漏。stack_ptr 仍在堆栈上,当函数返回时将被弹出,就像普通堆栈变量一样。 您正在释放它指向的内存。
它不是指针到指针,只有两者具有相同的值。没有什么会适合第二个。它仍将具有相同的值,但这次它将引用未分配的内存。
这是指针到指针 (PTR2):
int *ptr1;
int **ptr2 = &ptr1