试图计算我的 "sir"(字符串)class 的 ASCII 码总和

Trying to calculate ASCII code sum of my "sir" (string) class

#include <iostream>
#include <string.h>


using namespace std;

class sir{
  int lung; //sir lenght
  char* sirul;  //pointer to the first character form sir
  public:
    sir(const char*);//constructor,for test
    ~sir();// destructor
    char operator[](int index);
    int cod();


};

int sir::cod()
    {
        sir u=*this;
        char* s=sirul;
        int i,sum,l=lung;
        if (lung=0)
            cout<<"ASCII code sum is 0";
        else
        {
            for(i=0; i<l; i++)
                {
                    sum=sum+int(s[i]);
                }
        }
        return sum;
    }

sir::sir(const char* siroriginal)
{
  int lungime=strlen(siroriginal);//string length
  lung = lungime+1;
  sirul = new char[lung];
  strcpy(sirul,siroriginal);
}

sir::~sir(){
  delete sirul;
}

char sir::operator[](int index){
  if(index<lung && index >=0)return sirul[index];//verificare minima, verific daca este in limite
  return '[=12=]';
}

int main(){



  cout<<"--------------test for sir-----------------\n";
  sir s("un sir meserias");
  char c=s[1];
  cout<<c<<"\n";
    cout<<s.cod();



}

当我执行这个程序时,出现一个错误 "double free or corruption",我不明白是什么导致了这个错误。它出现在我试图用 cod 方法计算我的 sir(string) 的 ASCII 码总和之后,应该 return 一个整数值。

我该如何解决这个问题?

您的代码中几乎没有问题:

1.第一:

您有一个 不匹配 new[]/delete 呼叫。将 delete sirul 替换为 delete[] sirul.

2。第二个:

sir::cod 中,您实际上是通过

复制您的对象
sir u=*this;

因为您根本没有使用 u,您应该删除这一行。它是你双重自由的源泉。在cod函数的最后,u会被销毁,你的内部指针sirul也会被删除。但是由于您没有定义任何复制运算符,编译器将为您生成它,您最终将在两个 sir 实例之间共享一个指针。 当第二个实例被销毁时,sirul 再次被删除。导致错误。

3。第三个:

接下来,在 cod 中,您忘记将 sum 初始化为 0。这就是您结果不佳的原因。

4。第四个:

cod 中,您正在做 if (sum = 0)。您在这里缺少 ==