我的理解是在C和C ++中,通过调用:
创建一个字符数组char *s = "hello";
实际上创建了两个对象:在静态空间中创建的只读字符数组,意味着它在程序的整个持续时间内存在,以及指向该内存的指针。指针是其范围的局部变量然后死亡。
我的问题是当指针死亡时数组会发生什么?如果我在函数内部执行上面的代码,这是否意味着在退出函数后我有内存泄漏?
答案 0 :(得分:6)
它在整个计划期间存在
确切地说,它正式存储static
。
当指针死亡时,数组会发生什么?
没有
如果我在函数内执行上面的代码,这是否意味着我在退出函数后出现内存泄漏?
不,因为(1)。 (当程序退出时,该阵列仅被“释放”。)
答案 1 :(得分:1)
不,没有泄漏。
文字字符串存储在程序的数据部分中,通常将其加载到只读存储器页面中。所有等效的字符串文字通常都指向相同的内存位置 - 它是一个单独的类型。
char const *a = "hello";
char const *b = "hello";
printf("%p %p\n", a, b);
这应该为两个指针显示相同的值,并且对同一函数的连续调用也应该打印相同的值。
(请注意,您应该将这样的变量声明为char const *
- 指向常量字符的指针 - 因为数据是共享的。通过指针修改字符串文字是未定义的行为。最好如果你的程序崩溃了内存页面是只读的,在最坏的情况下,您将在整个程序中更改每次出现该字符串文字的值。)
答案 2 :(得分:1)
const char * s =“你好”;是代码(程序)的一部分 - 因此常量永远不会改变(除非你有一些讨厌的机制在运行时改变代码)
答案 3 :(得分:0)
我的问题是当指针死亡时数组会发生什么?如果我 在函数内执行上面的代码,这是否意味着我有一个 退出函数后出现内存泄漏?
当指针死亡时,不存在内存泄漏并且数组没有任何反应。
只有动态分配才能通过malloc()
进行内存泄漏。当您malloc()
某事时,您必须稍后free()
。如果不这样做,就会出现内存泄漏。
在你的情况下,它是一个“静态分配”:分配和释放这个内存空间将自动释放,你不必处理它。
答案 4 :(得分:0)
这是否意味着我在退出函数后出现内存泄漏?
不,没有内存泄漏,字符串文字具有静态持续时间,并且在程序完成时将被释放。引自C++ draft standard部分2.14.5 String literals
小节8
:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间
第3.7.1 Static storage duration
节说:
[...]这些实体的存储应在程序期间持续
请注意,在C ++中,这一行:
char *s = "hello";
使用已弃用的转化,请参阅C++ warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]了解详情。
正确的方法如下:
const char *s = "hello";
答案 5 :(得分:-1)
如果你使用malloc或new
,你只需要免费编辑:
char * string =“a string”;内存分配是静态的,而不是好的做法(如果它是常量的,声明应该是一个const char *) 因为当函数结束时它在堆栈中,它应该与其余的局部变量和参数一起被销毁。 当您为变量分配内存时,需要使用特定的malloc / free和new / delete: char * string = new char [64]; - >删除字符串; char * string = malloc(sizeof(char)* 64); - >自由(字符串); //除非你必须使用C
,否则这不是最佳做法