| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3396 人关注过本帖
标题:程序崩溃!但是去掉析构函数就没有问题了,求解.......
只看楼主 加入收藏
okokpypy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2017-6-1
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:7 
程序崩溃!但是去掉析构函数就没有问题了,求解.......
程序代码:
#include <iostream>
using namespace std;

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


    friend ostream &operator<<(ostream & o, const String &str){o<<str.str;return o;}
    friend istream &operator>>(istream&i, String &str){i>>str.str;return i;}
  

private:
    unsigned short int len;
    char*str; 

};

int main()
{
    String s1;
    cin >> s1;
    cout << s1;
    return 0;
}
搜索更多相关主题的帖子: 崩溃 析构函数 str String return 
2017-06-01 22:15
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:5 
delete str;
可能应该这样,毕竟声明是用的char*, 不是[]
2017-06-01 22:48
LittleJewel
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2017-6-1
收藏
得分:5 
可能是没有分配足够空间给它去存入字符串,所以析构的时候出错了

错误:检测到应用程序在堆缓冲区结束后写入内存

你试下分配多点空间再试下
2017-06-01 22:48
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
发现我解释的逻辑好像有点问题
2017-06-02 06:36
观海听潮
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2016-8-28
收藏
得分:5 
str=new char[1];这里分配的空间不够写含有一个字符的字符串,所以写入时一定会占用没有说明分配的空间,若不析构还好,一析构就把没有说明分配的内存空间给析构了,一定会出错
2017-06-02 09:44
某一天
Rank: 2
等 级:论坛游民
威 望:1
帖 子:33
专家分:77
注 册:2015-6-15
收藏
得分:5 
这里错了: i>>str.str;

用于保存字符串的内存空间只分配了一个字节的内存:str=new char[1];
在使用 i>>str.str; 的时候系统不会自动给你分配内存,也不会自动给你判断是否超界.这里除非放一个空字符串进去,否则不管你放什么进去都会超界.
C++中超界时,当时不会报错(但实际上已经出错了),等你释放空间的时候就会崩溃.

所以当你不要析构函数时虽然也没报错,但是已经有两个潜在的巨大隐患了:
1.超界,2内存泄漏.

正确的修改思路是,在 >> 里,判断i的长度,释放掉原有内存,重新分配新内存



[此贴子已经被作者于2017-6-2 09:58编辑过]

2017-06-02 09:57
okokpypy
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2017-6-1
收藏
得分:0 
我发现根本就不能用cin>>接收字符,因为这货没有审查机制,也没有内存扩充机制,只要使用,立马强制写入,100%越界,根源就是无法事先知道用户输入多少个字符,你开辟10000个字符空间,结果用户输入10001个,立马崩溃!
2017-06-02 11:56
某一天
Rank: 2
等 级:论坛游民
威 望:1
帖 子:33
专家分:77
注 册:2015-6-15
收藏
得分:0 
自定义字符串里边的>>运算符不好搞,网上插资料得到的基本上都有问题.
主要是istream中读数据不好搞.开放的std::string源代码中又太复杂,很多东西也无法移植.

或许可以这样:

istream &operator>>(istream &is,String &str){
    char buff[1024]; // 超过1024之后不接收
    is.getline(buff, 1024);

    delete[] str.str;

    str.len = strlen(buff);
    str.str = new char[str.len + 1];

    strcpy_s(str.str, str.len + 1, buff);

    return is;
}

不过这么干似乎也有问题.
2017-06-02 14:01
快速回复:程序崩溃!但是去掉析构函数就没有问题了,求解.......
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018117 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved