异常的显示错误

Extraordinary display bug

本文关键字:错误 显示 异常      更新时间:2023-10-16

晚上好。对不起,我不能更准确地说明这个问题。

以下代码不显示任何内容,除非:

1。

我把开头的三行未使用的注释行去掉了,它们不会产生任何冲突。

2。除非我把main()中的"Hello"改成"Hello world"

我正在使用代码块10.05.

完整代码:

#include <iostream>
using namespace std;
class stringclass
{
   protected :
      inline bool success()   { failbit = false;  return true; } //line to ignore
      inline bool fail()      { failbit = true; return false; } //line to ignore
   public :
      bool failbit; //line to ignore
      char * mystring;
      long memsize;
      long length;
      void reset();
      void alloc(long newsize);
      void copy(const stringclass & other);
      stringclass(const char str[]);
      stringclass()                          {reset(); }
      stringclass(const stringclass & other) {copy(other); }
      ~stringclass()                         {delete [] mystring;}
      friend ostream& operator << (ostream& out, stringclass & obj)   {out << obj.mystring; return out;}
};
void stringclass::reset()
{
   delete [] mystring;
   mystring = NULL;
   length = 0;
   memsize = 0;
}
void stringclass::alloc(long newsize)
{
   delete [] mystring;
   mystring = new char[newsize];
   memsize = newsize;
   mystring[0] = 0;
   length = 0;
}
void stringclass::copy(const stringclass & other)
{
   if(other.mystring == NULL) reset();
   else
   {
      alloc(other.memsize);
      strcpy(mystring, other.mystring);
      length = strlen(mystring);
   }
}
stringclass::stringclass(const char str[])
   : mystring(NULL), memsize(0), length(0)
{
   if(str == NULL) reset();
   else
   {
      alloc(strlen(str) + 1);
      strcpy(mystring, str);
      length = strlen(mystring);
   }
}
int main()
{
      stringclass str = "Hello";
      stringclass str2 = str;
      cout << "str = " << str << endl;
      cout << "str2 = " << str2 << endl;
      cout << endl;
      system("PAUSE");
      return 0;
}

代码显示:

str =
str2 =
Press any key to continue...

:

str = Hello
str2 = Hello
Press any key to continue...
修改后的

:

str = Hello world
str2 = Hello world
Press any key to continue...

我刚刚试着运行这个,并得到了一个段错误。

阅读你的代码-你不确定你的字符串是否以空结束。Strcpy()和strlen()期望字符串以空结束。这肯定会导致随机行为。我运行了你的代码,得到了一个段错误-当打印长度是垃圾值。这很可能是你的问题。

有一个明显的错误:stringclass::reset()stringclass::alloc(), delete[]stringclass::mystring,即使是NULL或初始化。好:

stringclass::stringclass()
: mystring(0), memsize(0), length(0) {}
void stringclass::reset()
{
   if(mystring) delete[] mystring;
   mystring = 0;
   memsize = 0;
   length = 0;
}
void stringclass::alloc(long newsize)
{
  if(memsize < newsize) {
    if(mystring) delete[] mystring;
    memsize = newsize;
    mystring = new char[memsize];
  }
  length = 0;
}

等等……但更好:使用std::string

您的stringclass的复制构造函数没有初始化类成员。

当像这样实现复制构造函数时,它应该可以工作。

stringclass::stringclass(const stringclass & other)
: mystring(0), memsize(0), length(0)
{
    copy(other);
}
相关文章: