字符数组将在程序的整个执行过程中一直存在,因为它们具有静态存储持续时间。这并不意味着您需要删除它们——它们应该在您的整个程序期间都存在。事实上,调用delete
它会给你未定义的行为。您只能delete
分配与new
.
指针本身具有自动存储持续时间,并在超出范围时被销毁。值得注意的是,指针必须是 aconst char*
因为字符串文字为您提供了一个const char
. 考虑:
void func()
{
const char* str = "Hello";
}
包含的字符数组在Hello\0
您的程序期间存在。指针str
仅在该函数的持续时间内存在。什么都不需要在deleted
这里。
如果你仔细想想,这很有意义。您在源代码中编写的所有这些字符串都必须存在于您的可执行文件中的某个位置。编译器通常将这些字符串写入可执行文件的数据段。当你运行你的程序时,可执行文件和包含你的字符串的数据段一起被加载到内存中。
如果您的程序中有两个字符串文字具有相同或重叠的文本,则编译器没有理由不能将其优化为仅存储其中一个。考虑:
void func()
{
const char* str1 = "Hello";
const char* str2 = "Hello";
const char* str3 = "lo";
}
编译器只需Hello\0
在此处将字符写入可执行文件一次。前两个指针将指向 the H
,第三个将指向第二个l
。您的编译器可以进行这样的优化。当然,在这个例子中,编译器可以通过将字符串全部去掉来进行更进一步的优化——它们不会以任何有助于程序可观察行为的方式使用。
所以是的,如果你有一百万个不同的字符串文字在某种程度上有助于程序的可观察行为,那么它们当然必须作为可执行文件的一部分存在。