【发布时间】:2020-02-19 07:37:44
【问题描述】:
我很想知道如果你在函数中声明一个 int 指针,然后使用 malloc 动态分配它会发生什么
void testing(){
int *p = malloc(sizeof(int));
*p = 5;
}
即使在函数执行完成后指针被销毁,数据(在本例中为 5)是否仍然存在于堆中?
【问题讨论】:
标签: c pointers malloc global-variables
我很想知道如果你在函数中声明一个 int 指针,然后使用 malloc 动态分配它会发生什么
void testing(){
int *p = malloc(sizeof(int));
*p = 5;
}
即使在函数执行完成后指针被销毁,数据(在本例中为 5)是否仍然存在于堆中?
【问题讨论】:
标签: c pointers malloc global-variables
在这个函数中
void testing(){
int *p = malloc(sizeof(int));
*p = 5;
}
局部变量(指针)p 具有自动存储期限。
对于这样一个没有变长数组类型的对象, 它的生命周期从进入它所在的块开始 关联,直到该块的执行以任何方式结束。(C 标准)。
使用 malloc 占用分配内存的对象具有分配的内存持续时间。
分配对象的生命周期从分配开始直到 解除分配。 (C 标准)。
因此,由于内存没有显式释放,因此对象的生命周期会延长,直到程序完成。您无法访问该对象或重用分配的内存,因为在退出函数后,它存储在局部变量p 中的地址会丢失。这种情况会引发内存泄漏。
【讨论】:
数据(本例中为 5 个)是否存在于堆中,即使 指针被破坏了?
是的,它被称为内存泄漏。您分配了内存并将其引用存储在指针p 中,当p 被销毁时,您只会丢失对分配内存的引用,从而导致内存泄漏。
【讨论】:
使用malloc() 或calloc() 分配的内存不会自动释放。您必须显式调用free() 才能取消分配内存。
// Allocate
int* p = (int*)malloc(10 * sizeof(int));
// De-allocate
free(p);
【讨论】: