char *空间分配

时间:2013-08-09 14:32:33

标签: c++ memory-leaks string-literals

我的理解是在C和C ++中,通过调用:

创建一个字符数组
char *s = "hello";

实际上创建了两个对象:在静态空间中创建的只读字符数组,意味着它在程序的整个持续时间内存在,以及指向该内存的指针。指针是其范围的局部变量然后死亡。

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

6 个答案:

答案 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

,否则这不是最佳做法