使 char* 指向另一个字符串文字泄漏内存吗?
Does making a char* point to another string literal leak memory?
我对这个简单的例子有一些误解:
char *s = "abc";
s = "def";
第二个字符串的赋值会导致内存泄漏,还是会被适当替换?如果前者为真,我该如何以正确的方式替换 s
的值?
两个字符串都是静态定义的,因此没有内存泄漏。泄漏的内容是:
char *s = strdup("abc"); // dynamic memory allocation
s = "def";
实际上有一个小的静态内存浪费(不会称之为泄漏)因为你不能再使用 "abc"
。
但是因为即使调用你的代码所在的例程也不能重复,我绝对不会称之为泄漏。
现在如果你有 char s[] = "abc";
(数组,不是指针)和一个大小相等的 "def"
字符串,你可以这样做:
strcpy(s,"def");
替换字符串的内容(但不要在静态分配的指针上执行此操作,例如定义您的代码:未定义的行为)。
没有。没有内存泄漏。
您只是将 s
更改为指向不同的字符串文字,这很好(这样:s = "def";
)。
简单地说,如果您没有使用 malloc
/calloc
/realloc
或任何 returns 动态分配内存(和文档)的函数自己分配任何内容告诉你 free()
。例如,POSIX 的 getline()
函数就是这样做的),你不需要 free()
。
您的代码段:
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;
此处您将 s1
设置为 s2
。因此,这意味着 s1
的内存位置不再存在,因为 s1
指向 s2
,而不是它分配的原始内存位置。您不能再使用 free(3)
deal-locate 这个指针,因为它们不再是对其位置的引用。如果您从不 free()
在堆上分配指针,那也会导致内存泄漏。
我对这个简单的例子有一些误解:
char *s = "abc";
s = "def";
第二个字符串的赋值会导致内存泄漏,还是会被适当替换?如果前者为真,我该如何以正确的方式替换 s
的值?
两个字符串都是静态定义的,因此没有内存泄漏。泄漏的内容是:
char *s = strdup("abc"); // dynamic memory allocation
s = "def";
实际上有一个小的静态内存浪费(不会称之为泄漏)因为你不能再使用 "abc"
。
但是因为即使调用你的代码所在的例程也不能重复,我绝对不会称之为泄漏。
现在如果你有 char s[] = "abc";
(数组,不是指针)和一个大小相等的 "def"
字符串,你可以这样做:
strcpy(s,"def");
替换字符串的内容(但不要在静态分配的指针上执行此操作,例如定义您的代码:未定义的行为)。
没有。没有内存泄漏。
您只是将 s
更改为指向不同的字符串文字,这很好(这样:s = "def";
)。
简单地说,如果您没有使用 malloc
/calloc
/realloc
或任何 returns 动态分配内存(和文档)的函数自己分配任何内容告诉你 free()
。例如,POSIX 的 getline()
函数就是这样做的),你不需要 free()
。
您的代码段:
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;
此处您将 s1
设置为 s2
。因此,这意味着 s1
的内存位置不再存在,因为 s1
指向 s2
,而不是它分配的原始内存位置。您不能再使用 free(3)
deal-locate 这个指针,因为它们不再是对其位置的引用。如果您从不 free()
在堆上分配指针,那也会导致内存泄漏。