帮忙看看这个语法问题,那里错了。

guxia6 2007-07-29 11:14:05
//1,
char *name;
name = NULL; //(1)
.......
.......
if(name)
delete [] name; //(2)

//这种初始化是我看的书上的写法,我只是添了一个if(name),编译没问题,执行的时候,(1)可以执行,但到了(2)就会出错。


//2,
char *name;
name = new char[strlen("none")+1];
name = "none"; //(1)
.......
.....
delete [] name; //(2)

//这种初始化,编译也没有问题,执行的时候(1)可以执行,但是到了(2)也会出错。提示是 debug assertion failed!

这都是为什么出错呢,是因为环境么。我的是vc6.0。

我也知道一种正确写法:
name = new char[strlen("none")+1];
strcpy(name, "none");
......
......
delete [] name;

我想知道的时前两个为什么会错呢?
请教高手。
...全文
126 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LoveYouJustOneDay 2007-07-30
  • 打赏
  • 举报
回复
if(name) delete []name是个愚蠢的做法

C++里 delete一个0指针是安全的
R9R9R9 2007-07-30
  • 打赏
  • 举报
回复
1:
char *name;
name = NULL;
if(name)
delete [] name; //name 只是一个普通的指针,没有对它进行动态的内存分配,不能使用delete[]操作

2:
char *name;
name = new char[strlen("none")+1];//在这里虽然是对name进行了动态的内存分配操作
name = "none"; //但是在这里,又对name指针进行的重新的赋值操作,name现在指向的是"none"这个字符串返回的一个const char *类型的指针,当然之后就不可以对其他进行delete []name操作,而且原先你所分配的new char[strlen("none")+1]没有进行delete [],产生了内存泄漏了
guxia6 2007-07-30
  • 打赏
  • 举报
回复
got
谢谢。看来偶的c++ 长征连第一步都没有走出呢。
jixingzhong 2007-07-30
  • 打赏
  • 举报
回复
void main()
{
char *name;
name = NULL;
if(name)
delete[] name;
}

当然没有问题。

出错的原因是 ... 部分代码对name的操作,
使得name 指向一个非堆地址,那么delete是非法的。
jixingzhong 2007-07-30
  • 打赏
  • 举报
回复
第一个问题不成立
jixingzhong 2007-07-30
  • 打赏
  • 举报
回复
name = new char[strlen("none")+1];
name = "none"; //(1)

name 被重新指向一个 const 字符串首地址,
而不是吧 字符串拷贝到 name 分配的地址中来,
delete 只能释放 为name 分配的地址,
但是 1 语句执行后,name不是指向 这个分配的地址的,
所以出错。

33,311

社区成员

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

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