c++中string的重载*操作符

Overloading * operator for string in C++

本文关键字:操作符 重载 string c++      更新时间:2023-10-16

我需要使用这个(*)运算符乘以一个字符串x次。例如:

 String a = "First";
 String b = a*2; // then b = "FirstFirst"

但是它崩溃了。最奇怪的是,它有时会崩溃。有几次它可以工作,然后崩溃。

这是我的string-class

    class String {
      int len;
      char *str;
    public:
      String () {
      len = 0;
      str = NULL;
      }
      String(const char *);
      String(const String &);
      ~String() {
      delete [] str;
      }
      String operator++(int notused);
      String & operator =(const String &); 
      friend int operator == (const String &, const String &); 
      friend ostream & operator <<(ostream &, const String &);
      friend istream & operator >>(istream &, const String &);
      friend String operator*(const String & s1, int x);
      friend String operator*(int x, const String & s1);
    };
这里是*操作符和一些构造函数的重载:
      String::String(const char * ptr)
      {
       str = new char [(len = strlen(ptr)) + 1];
       strcpy(str, ptr);
      }
      String::String(const String & s)
      {
       str = NULL;
       if(len = s.len){
       str = new char [len + 1];
       strcpy(str, s.str);
       }
      }
      String operator*(const String & s1, int x)
      {
         String result = s1;
         result.str = new char[(s1.len)*x];
         strcpy (result.str, s1.str);
         result.len = x*s1.len;;
         for (int i = 0; i < (x-1); i++)
         {
           strcat (result.str, s1.str);
         }
         return result;
      }

首先我检查了字符串的长度。但我认为他们还好,那有什么问题吗?

因此,我用以下行分配了新的内存:

    String result = s1;
    result.str = new char[(s1.len)*x];

对于0到7的数字,它可以完美地工作。8点就崩溃了。大小是关键。如果我用double-X乘以:

result.str = new char[(s1.len)*x*x];

然后我可以穿过8-barrier。有时我看到bad_alloc错误

这个问题是因为你没有在operator*中分配新的内存

strcpystrcat假设字符数组足够大,可以包含结果字符串。

您应该分配足够的内存,以便在构造函数中完成