高手请教一个关于c++string的神奇错误

最近老是觉得c++的string表现怪异,写了一个简单的程序测试(如下),果真是string搞的鬼,高手能解释一下为何吗?
#include <string>
#include <iostream>
using namespace std;

int main()
{
char *s1 = "abc";
string str1;
str1.append(s1);
s1 = "dde";
string str2(s1); //报错,断点停止这里,提示:已触发了一个断点。
delete s1; //若此句去掉,程序不会出现上面错误,运行结果也正常
cout << str1.c_str();
cout << str2.c_str();
int i;
cin >> i;
return 0;
}

这段代码看来对string的用法很正常,但是为什么释放s1会导致前面str2构造失败,str2构造是在释放s1之前啊,而且str2不是使用它的值初始化自己而已吗?还有一个特点,无论delete放在string str2(s1)之后return之前的任何地方,断点总是执行到delete之前的一个语句报错,永远执行不到delete语句,真是神奇!困惑中,哪位高手能解释个所以然啊?环境vc++.net2015

char *s1 = "abc";

在栈上分配了静态变量 (static variable),它的生存期与main函数的生存期相同,在此期间不能被删除。
当main函数执行完毕,其占用内存会自动释放。

delete 与 new 相对应,用于删除分配在堆上的变量。

换句话,如果使用delte,之前的内存应该是new分配的

楼上正解,delete了自动变量

你的属于赋值常量,不是分配的内存,所以不需要delete

没有new拿来的delete 版主你这是看的那本书求赐教。一般一个new对应一个delete 一个new[]对应一个delete[]