免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3453 | 回复: 8
打印 上一主题 下一主题

[C++] 程序崩溃!但是去掉析构函数就没有问题了,求解................ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-06-01 21:55 |只看该作者 |倒序浏览
  1. #include <iostream>
  2. using namespace std;

  3. class String
  4. {
  5. public:
  6.     String(){len=0;str=new char[1];str[0]='\0';}
  7.     ~String(){delete []str;len=0;};  //注释掉此行就啥事没有

  8.     friend ostream &operator<<(ostream & o, const String &str){o<<str.str;return o;}
  9.     friend istream &operator>>(istream&i, String &str){i>>str.str;return i;}
  10.    
  11. private:
  12.     unsigned short int len;
  13.     char*str;  
  14. };

  15. int main()
  16. {
  17.     String s1;
  18.     cin >> s1;
  19.     cout << s1;
  20.     return 0;
  21. }
复制代码


论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2017-06-01 22:56 |只看该作者
回复 1# okokpypy

是不是你的cin >> 溢出了?破坏掉了堆内存结构,cout只是简单的读出内容,所以没有问题
但是当你delete[]的时候,就需要归还堆内存了,这个时候就嗝屁了

论坛徽章:
0
3 [报告]
发表于 2017-06-02 00:40 |只看该作者
回复 2# lxyscls 求如何修改?


论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2017-06-02 09:12 |只看该作者
okokpypy 发表于 2017-06-02 00:40
回复 2# lxyscls 求如何修改?

如果是我讲的情况,保证buffer的大小永远比你的输入大1(考虑'\0')

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2017-06-02 09:55 |只看该作者
str=new char[1] 只申请了一字节,输入太长写溢出了

论坛徽章:
0
6 [报告]
发表于 2017-06-02 11:57 |只看该作者
我发现根本就不能用cin>>接收字符,因为这货没有审查机制,也没有内存扩充机制,只要使用,立马强制写入,100%越界,根源就是无法事先知道用户输入多少个字符,你开辟10000个字符空间,结果用户输入10001个,立马崩溃!

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [报告]
发表于 2017-06-02 12:19 |只看该作者
回复 6# okokpypy

审查机制要你自己实现啊。
你直接用
  1. <span \"lucida="" console\"",="" "\"courier="" new\"",="" serif;="" font-size:="" 12px;"="">i>>str.str;</span>
复制代码


还怪IOSTREAM。






论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2017-06-02 14:06 |只看该作者
本帖最后由 lxyscls 于 2017-06-02 14:09 编辑
okokpypy 发表于 2017-06-02 11:57
我发现根本就不能用cin>>接收字符,因为这货没有审查机制,也没有内存扩充机制,只要使用,立马强制写入,1 ...

cin是对象,你直接用它上面的方法好了,不要用operator>>

http://en.cppreference.com/w/cpp/io/basic_istream

  1. #include <iostream>

  2. using namespace std;

  3. int main(void) {
  4.     char buf[6];
  5.     cin.get(buf, 6);
  6.     cout << buf;
  7.     return 0;
  8. }
复制代码


论坛徽章:
0
9 [报告]
发表于 2017-06-09 16:19 |只看该作者
   ~String(){delete []str;len=0;};  //注释掉此行就啥事没有
} 后面多了个;
崩溃是什么?或者编译的错误是什么?
另外该代码会访问非法内存,内存溢出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP