转自百度https://zhidao.baidu.com/question/1796910478806131267.html
delete 只能用来删除用new分配的空间。
你用X=new int;那么这时X保存的是你向系统申请的空间的地址(new int的地址),这个地址你可以用delete把它释放。但是你在后面写着X=&varOne,那么这时X保存的是varOne变量的地址,这个变量是局部变量,函数返回时会自动释放的而不是你用delete释放的。你用了delete把varOne释放就是不合法的,确切的说varOne变量在栈区(内存的栈里头),而你用new分配的空间在堆里头,他们的内存区域是不同的,不能乱来。这里错误的原因是你把系统分配给你的varOne释放了导致错误,你释放的应该是new int的空间,而这个空间的地址本来用X保存的,但是你后面改了X的地址指向varOne,导致释放了varOne导致错误,因为他们内存区域不同,delete用于释放堆区的数据,而varOne是在栈区的。对于局部变量是放在栈区的,如果我们向系统申请空间,那么这个空间位于堆区,delete用于释放堆中的存储空间,不能胡来