请问高手我的代码有非法操作吗
#include"iostream"
#include"string.h"
using namespace std;
class mystring
{
public: mystring()
{
a = NULL;
}
mystring(int i);
mystring(char *m);
mystring(mystring &b);
~mystring()
{
delete []a;
}
mystring& display();
private:
char *a;
};
mystring&mystring:: display()
{
if(a)
cout<<'<'<<a<<">\n";
else
cout<<"<>\n";
return *this;
}
mystring::mystring(int n)
{
char k[n];
for(int i=0;i<n;i++)
k[i]=' ';
a=new char[n];
strcpy(a,k);
}
mystring::mystring(char *m)
{
a=new char[strlen(m)]; strcpy(a,m);
}
mystring::mystring(mystring &b)
{
a=new char[strlen(mystring::a)];
strcpy(a,mystring::a);
}
int main()
{
mystring s1("sdfgfdgdf"), s2(5), s3;
s1.display();
s2.display();
s3.display();
s3 = s1;
s3.display();
return 0;
}
得到了这样的信息:
Runtime Error:[ERROR] A Not allowed system call: runid:93315 callid:146
*** glibc detected *** ./Main: free(): invalid next size (fast): 0x082506b8 ***
[解决办法]
mystring::mystring(int n)
{
char k[n];
for(int i=0;i<n;i++)
k[i]=' ';
a=new char[n];
strcpy(a,k);
}
k没有0结尾。
mystring::mystring(char *m)
{
a=new char[strlen(m)]; strcpy(a,m);
}
分配strlen +1
mystring::mystring(mystring &b)
{
a=new char[strlen(mystring::a)];
strcpy(a,mystring::a);
}
b.a而不是mystring::a,长度也是strlen+1.
s3.display();
s3 = s1;
s3.display()
未定义operator =,属于浅拷贝。
[解决办法]
楼上+1
另外你报的错看上去是由于堆内存释放引起的
~mystring()
{
if(a!=NULL) //加上这句试试
delete []a;
}
[解决办法]
- C/C++ code
mystring::mystring(int n){ a=new char[n+1]; for(int i=0;i<n;i++) a[i]=' '; a[n]='\0';}
[解决办法]
类中有指针的必须自己定义拷贝构造函数 赋值操作符
否则会出现两个对象中的指针同时指向同一块内存,调用析构函数的时候就会对这块内存释放两次