Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 字符串的连续重新分配是否会导致内存泄漏?_Memory_Pointers_Character_Memory Leaks_Ansi - Fatal编程技术网

Memory 字符串的连续重新分配是否会导致内存泄漏?

Memory 字符串的连续重新分配是否会导致内存泄漏?,memory,pointers,character,memory-leaks,ansi,Memory,Pointers,Character,Memory Leaks,Ansi,我有两个问题: 问题1。字符指针用于指向存储给定字符串的位置。如果我们继续重新分配字符串,是否会导致内存泄漏 在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); st

我有两个问题:

问题1。字符指针用于指向存储给定字符串的位置。如果我们继续重新分配字符串,是否会导致内存泄漏

在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
$
$cat chk.c
#包括
#定义VP(无效*)
int main()
{
char*str;
str=“ABC”;
printf(“str=%p指向%s\n”,VP str,str);
str=“CBA”;
printf(“str=%p指向%s\n”,VP str,str);
返回0;
}
$cc chk.c&./a.out
str=0x8048490点到ABC
str=0x80484ab指向CBA
$

问题2。可以如上所述分配的字符串的最大长度是多少?

只有当我们使用
malloc/realloc/calloc
分配内存而忘记释放它时,内存泄漏才会占上风。在上面的例子中,没有我们自己分配内存的地方,所以没有内存泄漏。

当您为某个指针p分配内存,并且没有释放内存或没有使其他指针指向该内存时,如果您更改p的值,那么在这种情况下会发生内存泄漏

(例如)

那么如果你指定

p=q

然后会出现内存泄漏。 如果你不使用内存分配,那么就不会有任何内存泄漏

以及

char*q=“ABC”

在此语句中,q将自动指向一个恒定位置。因此,不能修改q值。 (例如)

这些语句将导致分段错误

更多参考:


好的,更具体地说,通常情况下(操作系统特定,但请注意,这是通用的,可能在某个地方的规范中)可执行文件的指令集中的某个地方是字符串“ABC”和“CBA”-它们嵌入在程序本身中。当您执行
str=“ABC”
时,您的意思是,“我希望此字符串指针指向包含字符串ABC的已编译程序中的地址”。这就是为什么运行时的“字符串”和文档中的“字符串文字”之间存在差异的原因。由于没有为文本分配空间(编译器将其烘焙到程序中),因此不必为其分配空间


无论如何,当你的进程被卸载时,操作系统会释放这个资源,这是卸载你的程序的自然副作用。事实上,一般来说,程序退出后不可能泄漏,因为操作系统会在程序退出时释放您忘记释放的任何资源,甚至是严重的泄漏。(这并不是完全正确的-如果您使用链接库的内容,您可能会导致另一个未卸载的程序泄漏-但这已经足够接近了)。这只是操作系统要处理的事情之一。

您的示例代码内存会泄漏吗? 不 您正在分配程序中已经存在的常量字符串,因此不会发生额外的内存分配

内存泄漏是由于忘记了malloc()类型的调用,或者是内部执行mallocs()类型操作的调用,而您可能不知道这些操作。小心返回指向内存指针的函数。。。例如strdup()。这样的内存可能不是线程安全的,也可能是内存泄漏的,如果不是两者都是的话。更好的是像snprintf()这样的函数,其中调用者提供内存缓冲区和最大大小。这些函数不会泄漏


最大字符串长度:除了可用内存外,通常没有人为限制。堆栈中的内存可能会受到各种约束的限制(char可能太大[1\u 000\u 000]),但malloc()中的内存则不然。Malloc内存是一个关于你有多少空闲内存的问题(char*ok=Malloc(1_000_000).您的本地大小\u t在理论上提供了分配的最大内存,但在实践中它要小得多。

谢谢Mahesh。您能指出有关此主题的更多信息的来源吗,即与释放字符指针有关的信息?这真是一个很好的解释。除了OP,它还帮助我…在系统软件中,我读取文字,您在这里提到了字符串文字。这两个概念是相同的吗?大体上,软件中的文字是硬编码数据的任何地方-因此您也可以有整数文字,比如'int num;num=20“:20是文字。我不确定你到底在做什么,但我不确定文字是否有一个严格的数学定义:如果使用动态语言怎么办?数字或字符串从未在任何地方编译过-它更多的是代码固有的数据块的概念,而不是从外部源读取。
char* p =  malloc(sizeof(char)*n);
char* q= "ABC";
char* q = "ABC";
q[1] = 'b';