程序崩溃!但是去掉析构函数就没有问题了,求解................
#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;
}
回复 1# okokpypy
是不是你的cin >> 溢出了?破坏掉了堆内存结构,cout只是简单的读出内容,所以没有问题
但是当你delete[]的时候,就需要归还堆内存了,这个时候就嗝屁了
回复 2# lxyscls 求如何修改?:cry:
okokpypy 发表于 2017-06-02 00:40
回复 2# lxyscls 求如何修改?
如果是我讲的情况,保证buffer的大小永远比你的输入大1(考虑'\0')
str=new char 只申请了一字节,输入太长写溢出了 我发现根本就不能用cin>>接收字符,因为这货没有审查机制,也没有内存扩充机制,只要使用,立马强制写入,100%越界,根源就是无法事先知道用户输入多少个字符,你开辟10000个字符空间,结果用户输入10001个,立马崩溃! 回复 6# okokpypy
审查机制要你自己实现啊。
你直接用
<span \"lucida="" console\"",="" "\"courier="" new\"",="" serif;="" font-size:="" 12px;"="">i>>str.str;</span>
还怪IOSTREAM。
本帖最后由 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;
}
~String(){delete []str;len=0;};//注释掉此行就啥事没有
} 后面多了个;
崩溃是什么?或者编译的错误是什么?
另外该代码会访问非法内存,内存溢出。
页:
[1]