提问人:ntk138 提问时间:4/24/2023 最后编辑:Vlad from Moscowntk138 更新时间:4/24/2023 访问量:122
这个 malloc/free 对是否泄漏内存?
Is this malloc/free pair leaking memory?
问:
我是 C 的新手。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void demo() {
char* s = malloc(10);
strcpy(s, "foo");
free(s);
}
int main()
{
demo();
}
这个程序会泄漏几个字节的内存吗?
答:
8赞
gsamaras
4/24/2023
#1
这个程序会泄漏几个字节的内存吗?
不可以。
free(s)
将取消分配此示例中动态分配的所有内存。char* s = malloc(10);
正如@Alexander评论的那样:“你关心的是最后 6 个字符吗?(过了结尾)不用担心,无论您如何使用它或放入什么,都会释放整个分配”s
"foo"
free()
s
好读:什么是内存泄漏?
评论
0赞
hetepeperfan
4/24/2023
我认为 strcpy,实际上会泄漏。
1赞
jarmod
4/24/2023
你能详细说明@hetepeperfan吗?为什么你认为strcpy会泄漏?
1赞
T.J. Crowder
4/24/2023
@hetepeperfan - 为什么会这样? 以 null 结尾,并且目标缓冲区有足够的空间来存储复制到其中的内容。"foo"
2赞
hetepeperfan
4/24/2023
对不起,我读了strdup,我的错误:-(
4赞
Vlad from Moscow
4/24/2023
#2
函数 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 );
评论
1赞
Vlad from Moscow
4/24/2023
@pmacfarlane 哦,谢谢。由于复制和粘贴,这是一个错别字:)
评论
s
"foo"
free
s
malloc
分配一点额外的内存,并使用它来存储分配的大小。恕我直言,这是一个重大的 C 设计错误。malloc()
free()