新人新手请教个问题

xlbdan 2006-12-15 10:35:19
大家好,我是听朋友的介绍来到这里的,新人,新手,请大家多多指教啊!
前一阵遇到一个问题,找到这里真是兴奋极了,这个问题终于要被解决了呵呵。

#define N 6 //为什么这里的N,当他是小于6的时候,在
//delete那里就要有内存错误?而把delete
char *Fun() //去掉之后又完全正常?而当N大于等于6的
{ //时候,不会有任何问题?
char *x=new char[N];
strcpy(x,"hello"); //我想问一下delete函数是清空的多少内存?
return x; //是不是new出来多少,就清空多少?
} //另外new出来的空间小于6,为什么hello\0
void main() //也也可以被strcpy成功?而只是在delete
{ //时出现错误呢?谢谢大家!
char *p=Fun();
cout<<p<<endl;
delete p;
}
...全文
175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sirguan 2006-12-15
  • 打赏
  • 举报
回复
new之后是必须调用delete的,否则会有内存泄露,你写demo程序没有感觉,但是你想想如果你写的是7*24运行的程序,每此函数执行就算泄露1个字节,过不了多久你的内存就玩完了。
new之后delete出错其实就说明了你朝这块内存写东西出错了,不信你看看,随便开辟一个内存,不写任何东西,然后delete它,绝对不会出错。
xlbdan 2006-12-15
  • 打赏
  • 举报
回复
回复sirguan(123):
谢谢你,但是可能有的地方你误解了,在strcpy的时候,只要我new的空间不是0,在不调用delete的时候是好用的,就是说还是可以把hello拷进去的,也可以正确的输出;但如果想调用delete,那我在new的时候就必须得大于等于字符串的长度才行,否则内存出错。我看过strcpy的源码,他内部malloc的空间就是正好strlen(string)+1,这样当然没问题了,但他并没有解释长度变化时会产生的问题
xlbdan 2006-12-15
  • 打赏
  • 举报
回复
谢谢,可是我还有问题不是很明白。
如果new的是7(假如),那么delete就没有问题了,可字符串的大小是6,如果delete是看字符串大小来定的话,为什么7却不会有内存问题呢?
在数据结构中,一切的建链表,建树等操作都是在函数中进行的,那就必须要返回这个链表或树的头指针,也就是返回了内部的句柄,怎样才能避免这么做呢?因为我看到的所有数据结构方面的书都是这样做的。
sirguan 2006-12-15
  • 打赏
  • 举报
回复
//为什么这里的N,当他是小于6的时候,在delete那里就要有内存错误?而把delete去掉之后又完全正常?而当N大于等于6的时候,不会有任何问题?
----------- 因为strcpy(x,"hello");要拷贝6个字节的字符到x里面,所以N小于6的时候会出错,你可以执行strcpy( x,”a” ),那么这样只有N小于2的时候才会出错了。这样的原因是c字符串有一个结尾字符0,这个字符会被copy过去。也就是说你看到了是”hello”,其实长度为6,看到”a”,其实长度为2
//我想问一下delete函数是清空的多少内存?是不是new出来多少,就清空多少?
---------------对。
//另外new出来的空间小于6,为什么hello\0也也可以被strcpy成功?而只是在delete时出现错误呢?谢谢大家!
----------“Hello\0“就相当于”hello”,只是你明确把\0给写出来了,其实写不写都一样的,这个\0是默认存在并且只有一个的。
DonaldKnuth 2006-12-15
  • 打赏
  • 举报
回复
你的 delete p操作是按字符串类型来进行的,而当N为5时,你的在堆上实际分配的空间大小
不足,而p没有办法识别这个大小,是按字符串的大小来释放内存,当然会有问题。
同时,你的char *Fun()函数返回了内部数据的句柄,这样做是非常不安全的,请
参考(effictive c++ 条款29)
xlbdan 2006-12-15
  • 打赏
  • 举报
回复
嗯谢谢楼上,我在程序里改了,用delete []p,可问题还是同样
lann64 2006-12-15
  • 打赏
  • 举报
回复
你new的是数组,要delete []p;

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧