okokpypy 发表于 2017-06-01 21:55

程序崩溃!但是去掉析构函数就没有问题了,求解................

#include <iostream>
using namespace std;

class String
{
public:
    String(){len=0;str=new char;str='\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;
}


lxyscls 发表于 2017-06-01 22:56

回复 1# okokpypy

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

okokpypy 发表于 2017-06-02 00:40

回复 2# lxyscls 求如何修改?:cry:


lxyscls 发表于 2017-06-02 09:12

okokpypy 发表于 2017-06-02 00:40
回复 2# lxyscls 求如何修改?

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

hellioncu 发表于 2017-06-02 09:55

str=new char 只申请了一字节,输入太长写溢出了

okokpypy 发表于 2017-06-02 11:57

我发现根本就不能用cin>>接收字符,因为这货没有审查机制,也没有内存扩充机制,只要使用,立马强制写入,100%越界,根源就是无法事先知道用户输入多少个字符,你开辟10000个字符空间,结果用户输入10001个,立马崩溃!

folklore 发表于 2017-06-02 12:19

回复 6# okokpypy

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

还怪IOSTREAM。






lxyscls 发表于 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

#include <iostream>

using namespace std;

int main(void) {
    char buf;
    cin.get(buf, 6);
    cout << buf;
    return 0;
}

lsyyff23 发表于 2017-06-09 16:19

   ~String(){delete []str;len=0;};//注释掉此行就啥事没有
} 后面多了个;
崩溃是什么?或者编译的错误是什么?
另外该代码会访问非法内存,内存溢出。
页: [1]
查看完整版本: 程序崩溃!但是去掉析构函数就没有问题了,求解................