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

Is this malloc/free pair leaking memory?

提问人:ntk138 提问时间:4/24/2023 最后编辑:Vlad from Moscowntk138 更新时间:4/24/2023 访问量:122

问:

我是 C 的新手。

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

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

int main()
{
    demo();
}

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

C 内存泄漏 malloc free

评论

6赞 Alexander 4/24/2023
您是否担心 的最后 6 个字符?(过了结尾)不用担心,无论您如何使用它或放入什么,都会释放整个分配s"foo"frees
1赞 Matt Timmermans 4/24/2023
malloc分配一点额外的内存,并使用它来存储分配的大小。恕我直言,这是一个重大的 C 设计错误。
1赞 Yohann 4/24/2023
事实并非如此。尝试在 valgrind 中运行它,如果存在内存泄漏,您会收到一条消息。
4赞 Lundin 4/24/2023
这里的实际问题是“什么是内存泄漏”吗?
1赞 John Bollinger 4/24/2023
规则是这样的:如果要在程序终止之前释放分配的内存,则随后必须将 或另一个分配函数返回的每个指针值传递给 ,恰好一次。如果您的程序在每次动态分配时都遵循该规则,那么它就不会泄漏内存。关于“内存泄漏”的定义是否应该允许未释放的内存,如果在程序终止时仍然可以访问,但该特定皱纹与您的程序无关,存在一些争论。malloc()free()

答:

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 哦,谢谢。由于复制和粘贴,这是一个错别字:)