LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 893|回复: 10

关于Gtk+程序中内存分配与释放的一个小问题

[复制链接]
发表于 2005-8-28 20:20:38 | 显示全部楼层 |阅读模式
在Gtk+程序中可以直接把字符串赋值给gchar* 类型的指针变量,例如:

gchar* name;
name="11111";
name="22222";

请问,当name指向另一个字符串的时候("22222")储存原来字符串("11111")的空间,是否会被系统自动释放?还是需要程序员手动释放?如果需要程序员手动释放,有没有相应的函数?

请前辈指点,多谢多谢!
发表于 2005-8-28 22:37:08 | 显示全部楼层
程序员需要释放的空间是程序运行过程中动态分配的。
字符串常量的空间不是在运行时分配的,它是程序一启动就分配的,你是没法释放的。
回复 支持 反对

使用道具 举报

发表于 2005-8-30 09:14:42 | 显示全部楼层
Post by ma_jingyi
在Gtk+程序中可以直接把字符串赋值给gchar* 类型的指针变量,例如:

gchar* name;
name="11111";
name="22222";

请问,当name指向另一个字符串的时候("22222")储存原来字符串("11111")的空间,是否会被系统自动释放?还是需要程序员手动释放?如果需要程序员手动释放,有没有相应的函数?

请前辈指点,多谢多谢!


这些字符串一般放在代码段或者数据段中, 不需要释放, 当作常量看待就是了.
回复 支持 反对

使用道具 举报

发表于 2005-8-30 11:45:44 | 显示全部楼层
楼主可以试试输出name两次赋值前后的地址,给个参考:


  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char* name;
  5.         name="11111";
  6.         printf("%s\n", name);
  7.         printf("%d\n", &name);
  8.         printf("%d\n", name);
  9.         name="22222";
  10.         printf("%s\n", name);
  11.         printf("%d\n", &name);
  12.         printf("%d\n", name);
  13. }
复制代码

在我这里的输出:
11111
-1079377036
134513792
22222
-1079377036
134513802

&name是char*变量的地址,name是其所指向的字符串的首字母的地址。char*变量的地址显然是不会变的,但第二个字符串分配在不同的地址。但在栈上的对象会在当前block结束后被自动回收。

感谢10楼zbw76指出错误!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 14:47:07 | 显示全部楼层
Post by manphiz


说明name的地址没有便,两个字符串都被存到了同一个地址中。这也符合标准的规定

name的地址跟字符串的地址有什么联系?
你两次打印的都是name的地址,同一个变量的地址当然会是一样的了
回复 支持 反对

使用道具 举报

发表于 2005-9-6 13:00:07 | 显示全部楼层
Post by manphiz
楼主可以试试输出name两次赋值前后的地址,给个参考:

#include <stdio.h>

int main()
{
        char* name;
        name="11111";
        printf("%s\n", name);
        printf("%d\n", &name);
        name="22222";
        printf("%s\n", name);
        printf("%d\n", &name);
}

在我这里的输出:
11111
-1079377036
22222
-1079377036

说明name的地址没有便,两个字符串都被存到了同一个地址中。这也符合标准的规定





阁下这段代码剧经典、精炼、实用......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-6 23:33:29 | 显示全部楼层
多谢楼上几位!另外我想知道以下两种字符串赋值方式有什么不同:
gchar* name1="11111";
gchar* name2=g_strdup("22222");

因为当我在程序中执行g_free(name1)和g_free(name2)的时候,前者会报错,后者不会. 具体的报错信息,由于现在用的电脑上没有Linux系统,我马上给不出来..抱歉..
回复 支持 反对

使用道具 举报

发表于 2005-9-6 23:50:25 | 显示全部楼层
Post by ma_jingyi
多谢楼上几位!另外我想知道以下两种字符串赋值方式有什么不同:
gchar* name1="11111";
gchar* name2=g_strdup("22222");

因为当我在程序中执行g_free(name1)和g_free(name2)的时候,前者会报错,后者不会. 具体的报错信息,由于现在用的电脑上没有Linux系统,我马上给不出来..抱歉..

C 语言基础还是要看一下的吧。。
回复 支持 反对

使用道具 举报

发表于 2005-9-6 23:52:08 | 显示全部楼层
是否g_strdup()返回的是堆存储空间上的对象?
按照malloc()和free()的规律,free()只能释放分配在自由空间的对象,不能释放在栈上的对象。栈上的对象的生命周期在当前block结束后被自动释放。
个人认为是这样:name1和name2虽然都是gchar*类型,但name1指向栈对象,而name2指向堆对象(自由空间对象),故name1不能用g_free()释放,而是在当前block结束后自动释放。
回复 支持 反对

使用道具 举报

发表于 2005-9-7 11:33:58 | 显示全部楼层
引用:
作者: manphiz
楼主可以试试输出name两次赋值前后的地址,给个参考:

#include <stdio.h>

int main()
{
char* name;
name="11111";
printf("%s\n", name);
printf("%d\n", &name);
name="22222";
printf("%s\n", name);
printf("%d\n", &name);
}

在我这里的输出:
11111
-1079377036
22222
-1079377036

说明name的地址没有便,两个字符串都被存到了同一个地址中。这也符合标准的规定





阁下这段代码剧经典、精炼、实用......


=======================================
还有这样的说法啊????????????
printf("%d\n", &name);
打印出的是字符指针变量 name 的地址,当然不会变
字符串 "1111" 和 "2222" 的地址是
printf("%d\n", name);
就是是字符指针变量 name 的值
你看看"1111" 和 "2222" 的地址是一样的不是?
这两个字符串是编译时分配地址的,不用考虑释放内存,但是绝对不会保存在同一段内存上。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表