zhuwt2008 2017-04-27 15:27 采纳率: 33.3%
浏览 1180
已采纳

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)