是否将char *指向另一个字符串文字泄漏内存?
我有一个关于这个简单的例子一些误解:是否将char *指向另一个字符串文字泄漏内存?
char *s = "abc";
s = "def";
将在第二串的分配造成内存泄露,否则将被正确更换?如果前者为真,我该如何更换s
的正确值?
不。没有内存泄漏。
您只是简单地将s
更改为指向不同的字符串,这很好(使用:s = "def";
)。
简单地说,如果你还没有使用malloc
/calloc
/realloc
或返回一个动态分配的内存中的所有功能,你自己分配的东西(和文档告诉你free()
。例如,POSIX的getline()
功能不说),你不不需要free()
。
我相当肯定'getline()'使用'realloc()如果需要调整缓冲区的大小,所以你需要使用'free()',特别是如果失败。 – RoadRunner
这两个字符串都是静态定义的,所以没有内存泄漏。什么会泄漏是:
char *s = strdup("abc"); // dynamic memory allocation
s = "def";
其实有一个小的静态存储器废物(不认为这是一个泄漏),因为你不能够使用了。
但是由于即使通过调用你的代码所在的例程也不能重复,所以我绝对不会说这是一个泄漏。
现在,如果你有char s[] = "abc";
(数组,指针不)和"def"
字符串大小相等的,你可以这样做:
strcpy(s,"def");
替换字符串的内容(但不这样做的一个静态分配的指针,像定义你的代码:未定义的行为)。
“内存浪费”不明白这是什么,危险吗? – user3003873
不,你只是没有使用“abc”内存。没有危险,只是没用 –
你的代码是内存泄漏 - 由'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;
在这里你设置s1
到s2
。因此,这意味着s1
的存储位置不再存在,因为s1
指向s2
,而不是它分配的原始存储位置。您不能再处理 - 使用free(3)
找到此指针,因为它们不再是对其位置的引用。如果你从不在free()
上分配一个指针,那也会导致内存泄漏。
这不是传统意义上的内存泄漏 - 它不是一个错误。但是你的程序中会有无用的字面“abc”,在程序大小上增加了4个字节(哦,不!)。尽管优化编译器很可能会摆脱它。 – Lundin