代码1:
void foo(char * text) {}
foo("Test");
据我所知,这将会发生:
内存分配给“测试”
指针被创建并且其值被复制到(char *文本指针),因此(char * text)指向内存中的位置,其中“Test”是(更好的说,在第一个char上“测试”)
函数完成后,它会破坏指针(char * text),指向“Test”的开头,不会造成内存泄漏吗?
问题是,“测试”何时被删除,当函数仅销毁指针时
做smth不是更好。像那样? :
char * _text = "Test";
foo(_text);
delete[] _text;
答案 0 :(得分:3)
您可以将字符串文字视为代码的一部分。它们不是动态分配的,它们具有所谓的“静态存储持续时间”,这意味着它们在程序的持续时间内存在,并且它们不需要被释放(实际上,不能被释放)。
delete[]
使用new[]
创建的内容总是错误的,因此您的第二个代码段具有未定义的行为。
答案 1 :(得分:2)
“Test”是一个字符串文字,具有静态存储持续时间。在程序运行之前不会删除它。你不应该自己删除它。
答案 2 :(得分:0)
实际上它不会被删除。
该字符串在数据段中分配,对foo("Test")
的调用只是将指向该字符串的指针推送到堆栈,而不是像你所说的那样“复制”它。
它不是泄漏的内存,因为字符串是最终二进制文件的一部分,并且它总是在那里,在二进制的一部分中仅用于那种事情(常量等)。
字符串本身(“Test”的字节)放在只读部分的数据段中,而指针(例如char *_test = "Test"
)则存储在读写部分(堆栈)中或堆,它取决于指针的初始化和使用方式)。您可以修改指针,但不会从数据段中删除字符串。
答案 3 :(得分:0)
C中的硬编码值实际上被编译成二进制文件,因此不会被分配。更准确地说,它们出现在可执行文件的“数据”部分中,并且只要程序执行就会生效。
此外,指针不会被“破坏”。请记住,指针只是内存的地址,可能是任何地方(堆栈/堆)但指针不是对象。