是否将char *指向另一个字符串文字泄漏内存?

问题描述:

我有一个关于这个简单的例子一些误解:是否将char *指向另一个字符串文字泄漏内存?

char *s = "abc"; 
s = "def"; 

将在第二串的分配造成内存泄露,否则将被正确更换?如果前者为真,我该如何更换s的正确值?

+3

这不是传统意义上的内存泄漏 - 它不是一个错误。但是你的程序中会有无用的字面“abc”,在程序大小上增加了4个字节(哦,不!)。尽管优化编译器很可能会摆脱它。 – Lundin

不。没有内存泄漏。

您只是简单地将s更改为指向不同的字符串,这很好(使用:s = "def";)。

简单地说,如果你还没有使用malloc/calloc/realloc或返回一个动态分配的内存中的所有功能,你自己分配的东西(和文档告诉你free()。例如,POSIX的getline()功能不说),你不不需要free()

+0

我相当肯定'getline()'使用'realloc()如果需要调整缓冲区的大小,所以你需要使用'free()',特别是如果失败。 – RoadRunner

这两个字符串都是静态定义的,所以没有内存泄漏。什么会泄漏是:

char *s = strdup("abc"); // dynamic memory allocation 
s = "def"; 

其实有一个小的静态存储器废物(不认为这是一个泄漏),因为你不能够使用​​了。

但是由于即使通过调用你的代码所在的例程也不能重复,所以我绝对不会说这是一个泄漏。

现在,如果你有char s[] = "abc";(数组,指针不)和"def"字符串大小相等的,你可以这样做:

strcpy(s,"def"); 

替换字符串的内容(但不这样做的一个静态分配的指针,像定义你的代码:未定义的行为)。

+0

“内存浪费”不明白这是什么,危险吗? – user3003873

+1

不,你只是没有使用“abc”内存。没有危险,只是没用 –

+1

你的代码是内存泄漏 - 由'strdup'动态分配的空间没有被释放 –

您的代码段:

char *s = "abc"; 
s = "def"; 

不会造成内存泄漏。 char *s是内存中的指针。当您使用char *s = "abc"时,您设置了*s可指向的字符串文字。当您将s设置为字符串字面值"def"时,您所做的只是更改*s指向的位置。

注:只能用指针,并数组做到这一点。如果您想使用阵列,您可能需要使用strcpy(3)/strncpy(3)

由于您尚未分配任何指针,因此无论是使用malloc(3)//strdup(3),都很难获得内存泄漏。

但是,这里有一个内存泄漏的例子:

const char *str1 = "abc"; 
const char *str2 = "def"; 

char *s1 = malloc(strlen(str1)+1); /* dynamic memory allocation with malloc() */ 
char *s2 = malloc(strlen(str2)+1); 

s1 = s2; 

在这里你设置s1s2。因此,这意味着s1的存储位置不再存在,因为s1指向s2,而不是它分配的原始存储位置。您不能再处理 - 使用free(3)找到此指针,因为它们不再是对其位置的引用。如果你从不在free()上分配一个指针,那也会导致内存泄漏。