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

帮忙看看这个语法问题,那里错了。
//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;

我想知道的时前两个为什么会错呢?
请教高手。

------解决方案--------------------
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 [],产生了内存泄漏了
------解决方案--------------------
if(name) delete []name是个愚蠢的做法

C++里 delete一个0指针是安全的
------解决方案--------------------
name = new char[strlen( "none ")+1];
name = "none "; //(1)

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