这个malloc/free对是否泄漏内存?

ulydmbyx  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(147)

我是C的新手。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void demo() {
    char* s = malloc(10);
    strcpy(s, "foo");
    free(s);
}

int main()
{
    demo();
}

这个程序是否会泄漏几个字节的内存?

r6hnlfcb

r6hnlfcb1#

这个程序是否会泄漏几个字节的内存?

没有

在本例中,free(s)将取消分配由char* s = malloc(10);动态分配的所有内存。
@ Alexandria 评论道:“你担心的是s的最后6个字符吗?(超过"foo"的末尾)不用担心,free()将释放s的整个分配,无论您如何使用它或在其中放入什么。
阅读:What is a memory leak?

bvuwiixz

bvuwiixz2#

函数malloc的声明方式如下

void *malloc(size_t size);

它不知道分配的内存将如何使用以及将存储什么。
唯一的参数size指定分配的内存大小。
要释放已分配的内存,只需将指针传递到已分配的内存。
因此,这段代码既没有内存泄漏

char* s = malloc(10);
strcpy(s, "foo");
free(s);

指针s指向已分配的内存,该指针用于释放已分配的内存。而且,在分配的内存中是否存储了某些内容完全不重要。
如果你想减少或扩大分配的内存时,使用另一个标准的C函数realloc。该函数根据新分配的内存范围大小来保存存储在先前分配的内存中的数据。
例如,你可以写

char* s = malloc(10);
const char *foo = "foo";
strcpy( s, foo );

size_t n = strlen( s );

char *tmp = realloc( s, n + 1 );

if ( tmp != NULL ) s = tmp;

puts( s );

free( s );

相关问题