char*空间分配

char* Space Allocation

本文关键字:分配 空间 char      更新时间:2023-10-16

我的理解是,在C和C++中,通过调用创建字符数组

char *s = "hello";

实际上创建了两个对象:一个是在静态空间中创建的只读字符数组,这意味着它在整个程序期间都存在,另一个是指向该内存的指针。指针是指向其作用域的局部变量,然后终止。

我的问题是,当指针失效时,数组会发生什么?如果我在函数内执行上面的代码,这是否意味着我在退出函数后内存泄漏?

它在程序的整个过程中都有效

确切地说,形式上它具有static存储持续时间。

指针失效时数组会发生什么?

什么都没有。

如果我在函数内执行上面的代码,这是否意味着我在退出函数后内存泄漏?

不,因为(1)。(只有当程序退出时,数组才被"释放"。)

不,没有泄漏。

文字字符串存储在程序的数据部分,该数据部分通常加载到只读内存页中。所有等价的字符串文字通常都指向相同的内存位置——这是一个单例。

char const *a = "hello";
char const *b = "hello";
printf("%p %pn", a, b);

这应该为两个指针显示相同的值,并且对同一函数的连续调用也应该打印相同的值。

(请注意,由于数据是共享的,因此您应该声明char const *(指向常量字符的指针)等变量。通过指针修改字符串文字是未定义的行为。如果内存页是只读的,最好的情况下您会使程序崩溃,最坏的情况下,您会在整个程序中每次出现该字符串文字时更改的值。

const char*s="Hello";是代码(程序)的一部分-因此常数从未更改(除非您在运行时有一些讨厌的机制更改代码)

我的问题是,当指针失效时,数组会发生什么?如果我在函数中执行上面的代码,这是否意味着我有一个退出函数后内存泄漏?

不,当指针失效时,不会有内存泄漏,数组也不会发生任何变化。

只有通过malloc()进行动态分配,才可能发生内存泄漏。当你是malloc()的东西时,你必须稍后再free()。如果不这样做,就会出现内存泄漏。在您的情况下,这是一种"静态分配":该内存空间的分配和释放将自动释放,您不必处理它。

这是否意味着我退出函数后内存泄漏?

不,没有内存泄漏,字符串文字具有静态持续时间,并且在程序完成时将被释放。引用C++标准草案2.14.5 String literals小节8:

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为"array of n const char",其中n是如下定义的字符串大小,并且具有静态存储持续时间

3.7.1 Static storage duration节说:

[…]这些实体的存储应在程序期间持续

注意,在C++中,这一行:

char *s = "hello";

使用不推荐使用的转换请参阅C++警告:不推荐使用从字符串常量到"char*"[-Wwrite strings]的转换以获取更多详细信息。

正确的方法如下:

const char *s = "hello";

只有在使用malloc或新时才需要释放

编辑:

char*string="字符串";内存分配是静态的,不是很好的做法(如果它是常量,则声明应该是constchar*)因为当函数结束时它就在堆栈中,所以应该将它与其他局部变量和参数一起销毁。当您为变量分配内存时,需要使用特定的malloc/free和new/delete,如:char*string=新char[64];-->删除字符串;char*string=malloc(sizeof(char)*64);-->自由(字符串)//除非必须使用C ,否则这不是最佳实践