zhuwt2008
2017-04-27 15:27
采纳率: 95.1%
浏览 1.2k

高手请教一个关于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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 战在春秋 2017-04-27 22:15
    已采纳

    char *s1 = "abc";

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

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

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • 欧阳嘉 2017-04-28 00:01

    楼上正解,delete了自动变量

    评论
    解决 无用
    打赏 举报
  • 坤昱 2017-04-28 00:49

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

    评论
    解决 无用
    打赏 举报
  • wu110112 2017-04-28 01:56

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

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题