我有两个问题:
Q1。字符指针用于指向存储给定字符串的位置。如果我们继续重新分配字符串,是否会导致内存泄漏?
在Linux系统上,我看到:
$ cat chk.c
#include <stdio.h>
#define VP (void *)
int main()
{
char *str;
str = "ABC";
printf("str = %p points to %s\n", VP str, str);
str = "CBA";
printf("str = %p points to %s\n", VP str, str);
return 0;
}
$ cc chk.c && ./a.out
str = 0x8048490 points to ABC
str = 0x80484ab points to CBA
$
Q2。可以如上指定的字符串的最大长度是多少?
答案 0 :(得分:2)
您的示例代码内存是否会泄漏? 没有。 您正在程序中分配常量字符串,因此不会发生额外的内存分配。
内存泄漏来自忘记的malloc()类型调用,或内部执行mallocs()类型操作的调用,您可能不知道。注意返回指向内存的指针的函数...例如strdup()。如果不是两者,这往往不是线程安全或泄漏内存。更好的是像snprintf()这样的函数,其中调用者提供内存缓冲区和最大大小。这些功能不会泄漏。
最大字符串长度:除可用内存外,往往没有人为限制。堆栈中的内存可能受到各种约束(char can_be_too_big [1_000_000])的限制,但malloc()中的内存不受限制。 Malloc内存是一个你有多少可用内存的问题(char * ok = malloc(1_000_000)。你的本地size_t提供了理论上分配的最大内存,但实际上它要小得多。
答案 1 :(得分:1)
当我们使用malloc/realloc/calloc
分配内存并忘记free
时,内存泄漏才占优势。在上面的例子中,没有我们自己分配内存的地方,所以没有内存泄漏AFAIK。
答案 2 :(得分:1)
好的,更具体一点,通常会发生什么(特定于操作系统,但AFAIK,这是通用的,可能在某个地方的规范中)是可执行文件的指令集中的某个地方是字符串“ABC”和“CBA” “ - 这些都嵌入在你的程序中。当你执行str="ABC"
时,你会说,“我希望这个字符串指针指向我编译的程序中包含字符串ABC 的地址”。这就是为什么运行时“字符串”与“字符串文字”之间存在差异的原因,如果您在任何地方的文档中看到它。由于您没有为文字分配空间 - 编译器将其添加到您的程序中 - 您不必为其释放空间。
无论如何,当您的进程被卸载时,操作系统会释放此资源,这是卸载程序的一个自然副作用。实际上,一般来说,在程序退出后不可能泄漏,因为操作系统会在程序退出时解除分配您忘记的任何资源,甚至是令人发指的泄漏。 (这不完全正确 - 你可以导致另一个没有卸载的程序,如果你链接库的东西就会泄漏 - 但它足够接近)。这只是操作系统负责的事情之一。
答案 3 :(得分:0)
当您为somePointer p分配内存,并且没有释放内存或没有使其他指针指向该内存时,如果更改p的值,则在此情境中发生内存泄漏。
(延续)
char* p = malloc(sizeof(char)*n);
char* q= "ABC";
然后,如果你指定,
P = Q;
然后会有内存泄漏。 如果你不使用内存分配,那么就不会有任何内存泄漏。
和
char * q =“ABC”;
在此声明中,q将自动指向一个恒定的位置。因此q值无法修改。 (延续)
char* q = "ABC";
q[1] = 'b';
这些陈述将导致分段错误。
MoreReference: