冯小刚有亲生孩子吗:关于C++内存问题,急求!!!

来源:百度文库 编辑:高校问答 时间:2024/04/26 18:09:00
char *str=new char[10];
str="hi!";
printf("0x%x\n",str);
printf("%s\n",str);
delete str;
str=new char[5];
str="Hi!";
printf("%x\n",str);
printf("%s\n",str);
为什么运行时出现ASSERTATION?
toff先生的回答是说str指针指向了"hi!"这样一个const数组,内存无法回收.我觉得很有道理,但是我还有几个问题:
1.怎么样才不让他指向一个const的空间呢,我把它改为指向一个字符数组,同样的问题仍然存在2.为什么存放const值的内存无法回收?3.const值存储的方式是static的,那么是不是所有static的内存都无法回收呢?

char *str=new char[10];
str="hi!";
你第一句是让str指向一个new出来的10个字节的空间。
第二句你的意思应该是把hi复制到刚才的内存空间中,并且还是要str指向该空间。通过*str应该可以访问到。
这时你应该使用的是strcpy。
你的语句是把str作为了hi的引用。str所指向的内存的并不是hi,而是hi的地址。因此会出错!
而你说的const内存不能回收我分析可能是你的这条语句
str="hi!";
这句中等号后半段的字符串在创建的时候是在别处开辟对应大小的内存,跟str所指向的内存没有半点关系。所以后创建的hi。他被确定为带有const属性。你也提到了const的是static的,而我们又知道static的内容是在程序结束的时候由系统统一回收的。所以、。。。。
不知道你明白没?
E-mail:gldamao@gmail.com
有问题就mail我。

delete操作对应的是new操作, new是动态申请空间, delete是动态释放之前你申请的空间。

str="hi!" 是把字符串"hi!"的首地址的值赋给了str这个地址。 而不是把"hi!"的内容赋给数组str[]

你应该调用系统函数 strcpy(str, "hi!"); 这才是你的初衷。 这一块儿不是很好理解, 得仔细体会。 不知道我说明白了没有。

补充一下, toff先生说的没错, 但不是很好懂, 你现在可以不去那么理解, 这还涉及到编译的东西, 有点儿深了, 错误我已经说明了, 你不用去考虑和static的关系。 只要操作没有错误, 能用new申请, 通常就一定能用delete释放, 不用管其他的。

试一试改成
str="Hi!\0";
同样
strcpy(str, "hi!"); 也可以的!

代码中并没有说是指向const的也不是static!
这两个有点类似,就是程序一开始就分配内存!const,内容会锁定,值是不能改变的!(特殊除外)
static 是静态,程序只存在一个实例!

zamanewby说得太好了,请楼主始终记得,字符串赋值要用strcpy

栈&堆 这段程序是
《高质量c程序》具体书名记不清了
其中的一个程序吧

str="hi!"; 这样赋值是错误,str是个地址,而hi不能赋给地址的