是否每个new都要一个delete

是不是每个new都要一个delete
#include <iostream>
using namespace std;

void main()
{
   

  char* des = new char();
  des = "testing!";
  cout<<des<<endl;

delete des; //这个delete需要吗

}
1、为什么我加上那个delete,程序会出错?

2、const char* 和char* 有什么区别,因为我感觉他们指针指向的内容都不可变,但指针本身可以都可以再赋值,就是下面的代码是出错的
char* ch = "abc";
*ch = "def"; //这里会出错

const char* cch = "zxw";
*cch = "lmn"; //这里也会出错

求兄弟们指教,我是新手,因为看了好多帖子都说的不太明白

------解决方案--------------------
char* des = new char();//这里的des是你申请的内存地址
des = "testing!";//这里的des又被你重新赋值了,变成另一个地址。所以你delete的时候会出错


在初始化一个字符串的时候
char* ch = "abc";
相当于
const char* ch= "abc";

------解决方案--------------------
每一个new必须对应一个delete

1.vs2008没有报错
2.const char *指向内容不可变,char *指向的内容可变,你的问题在于char* ch = "abc";本身右边就是个字符串常量,所以*ch其实就是"abc",不能再赋值为"def",改成这样就行
C/C++ code
  char *test;
  char temp[] = "abc";
  test = temp;
  cout << test << endl;
  test = "def";
  cout << test << endl;
  delete test;

------解决方案--------------------
char* des = new char();//这里的des是你申请的内存地址
 des = "testing!";//这里的des又被你重新赋值了,变成另一个地址。所以你delete的时候会出错

你可以直接这样写:

char* des = "testing";
delete des;
------解决方案--------------------
第一个问题

你用new申请了一个char空间,把它的地址保存在了des这个指针里面
然后你又把"testing!"这个常量字符串的地址赋给了des这个指针
于是,你之前用new申请的那个空间就丢失了,在程序结束系统回收全部内存前,那个空间就被标明被你使用但实际上你已经丢失它的地址没办法再使用它了,这就是最常见的内存泄露
delete出错理所当然,因为你delete的不是你new的那个空间。甲被乙骗了钱不能去法院起诉丙,丙是无辜的

第二个问题

const char* 和char*的区别,从你的问题看得出来你是知道的,不用我多说
而你不知道的是,直接在代码里写下的"testing!"是常量字符串,即便你用char *这个指向变量的指针强行指向它,它本身依然是常量,不可修改
如果你用这两个类型的指针指向一个变量字符串,例如指向下面这个字符数组s:char s[10]="testing!";。那你就会发现你所学到的知识是正确的,因为存放在字符数组中的字符串是变量
------解决方案--------------------
从楼主给出的代码,可以看出对以下几点认识不足:
1. 
char* des = new char();
应该只分配一个byte的空间,而后面的des = "testing!";我猜楼主的意图是要将"testing!"放入des所指向的空间,很显然实际上是放不下去的。之所以输出有没有问题,是刚好将"testing"的首地址给了des,这就改变des的值,也就是des = "testing!"中的des,和前面的char* des = new char();已经不同了。

如果上面没有猜错楼主的意图,那么正确的做法应该是:
char* des = new char[10];
memset(des, 0, 10);
strcpy(des, "testing");

2. new和delete都要成对使用,这是没有错的,但楼主的delete为什么就出了问题呢?原因就是:delete必须delete用new得到的那个des,而不是des = "testing!"中的des,事实上des = "testing!"这句话执行以后,new出来的那个des已经成了dangling pointer,即通常说的“野指针”,该指针所指向的内存,程序员是无法主动收回了。


如果在1中没有猜错楼主的意图,那么正确的代码应该是:
C/C++ code

#include <iostream>
using namespace std;

void main()
{
    char* des = new char[10];
    memset(des, 0, 10);
    strcpy(des, "testing!");
    cout << des << endl;

    delete des;
}

------解决方案--------------------
严格点,6楼最后的代码,应该写成:
C/C++ code

#include <iostream>
using namespace std;

void main()
{
    char* des = new char[10];
    memset(des, 0, 10);
    strcpy(des, "testing!");
    cout << des << endl;

    delete[] des; // new[]和delete[]对应。但由于char是基本数据类型,所以6楼那样写应该也是没有问题的
}

------解决方案--------------------
我跟楼主一样是个初学者,对这方面不慎明了。感觉5楼的文字叙述加上六楼代码就能完全的回答楼主的问题了,受教了!问题的实质其实就是一个new动态分配出来的char * des = new char[],你不能直接这样 des = "testing" 赋值给他。而应该通过一些函数比如strcpy, memcpy來赋值,好像也可以通过des[0] = 't' ....这种方式來赋值(你试试的,这个方法没有确认)