xcd*_*n05 6 c++ memory pointers scope
标题说明了一切.
我发现了一个基本相同的旧问题,但我需要进一步澄清.
在这个问题中,接受的答案是:
Run Code Online (Sandbox Code Playgroud)char* text = "Hello, world";这里自动变量(指针)在堆栈上创建并设置为指向常量内存中的值,这意味着:
- ""中的字符串文字存在于整个程序执行中.
- 您不负责"分配"或"释放"它
- 你可能不会改变它.如果你想改变它,那么你必须分配一些"非常量内存"并将其复制到那里.
这是说指针被删除了,而不是指针指向的数据?如果我要在函数中创建1,000,000个指向字符的指针,当它们超出范围时我的所有内存都会被释放?或者只是制作指针所需的内存,将实际角色本身留在后面以占用我所有的记忆?
字符数组将在程序的整个执行过程中出现,因为它们具有静态存储持续时间.这并不意味着您需要删除它们 - 它们应该在整个程序期间保持不变.事实上,调用delete它会给你未定义的行为.你只能delete分配一些东西new.
指针本身具有自动存储持续时间,并在超出范围时被销毁.值得注意的是指针必须是a,const char*因为字符串文字为你提供了一个数组const char.考虑:
void func()
{
const char* str = "Hello";
}
Run Code Online (Sandbox Code Playgroud)
包含Hello\0在程序持续时间内的字符数组.指针str仅在该函数的持续时间内存在.没有什么需要在deleted这里.
如果你考虑一下,这很有意义.您在源代码中编写的所有这些字符串都必须存在于您的可执行文件中.编译器通常将这些字符串写入可执行文件的数据段.运行程序时,可执行文件会与包含字符串的数据段一起加载到内存中.
如果程序中有两个字符串文字具有相同或重叠的文本,则编译器无法将其优化为仅存储其中一个.考虑:
void func()
{
const char* str1 = "Hello";
const char* str2 = "Hello";
const char* str3 = "lo";
}
Run Code Online (Sandbox Code Playgroud)
编译器只需要在Hello\0此处将字符写入可执行文件.前两个指针只指向,H第三个指向第二个指针l.您的编译器可以进行这样的优化.当然,通过这个例子,编译器可以通过将所有字符串全部放在一起来进行更进一步的优化 - 它们不会以任何有助于程序可观察行为的方式使用.
所以,是的,如果你有一百万个不同的字符串文字,它们在某种程度上有助于程序的可观察行为,当然它们必须作为可执行文件的一部分存在.
| 归档时间: |
|
| 查看次数: |
8643 次 |
| 最近记录: |