我已经使用malloc对堆栈进行了模拟,以创建MAX元素数组并将其分配给指针。然后,我使第二个指针指向第一个指针,以便能够来回导航,执行推入和弹出操作。
int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;
最后,我使用
删除包含数组的指针free (stack);
删除数组( stack )后, stack_ptr 指向没有内容的地址,对吗?
即使程序恰好在之后终止,这是否会导致内存泄漏或任何类型的问题?
答案 0 :(得分: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 :(得分:1)
没有内存泄漏,因为您做了指针的副本。因此指针stack_ptr
指向未分配空间。
如果您想在代码后读取stack_ptr
所指向的内容,则将导致分段错误,因为您释放了malloc分配的空间。
答案 2 :(得分:1)
https://en.wikipedia.org/wiki/Dangling_pointer
如果尝试取消引用段,则可能会也可能不会,但它悬而未决。虽然没有内存泄漏。 stack_ptr仍在堆栈中,并且在函数返回时将被弹出,就像普通的堆栈变量一样。您正在释放它指向的内存。
答案 3 :(得分:1)
它不是指向仅具有相同值的指针。第二件事什么都不会发生。它将仍然具有相同的值,但是这次它将引用未分配的内存。
这是指向指针(ptr2)的指针:
int *ptr1;
int **ptr2 = &ptr1