首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教高手小弟我的代码有非法操作吗

2012-05-15 
请问高手我的代码有非法操作吗#includeiostream#includestring.husing namespace stdclass mystring{

请问高手我的代码有非法操作吗
#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';}
[解决办法]
类中有指针的必须自己定义拷贝构造函数 赋值操作符 
否则会出现两个对象中的指针同时指向同一块内存,调用析构函数的时候就会对这块内存释放两次

热点排行