#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 '\0';
}

int main(){



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



}

当我执行该程序时,错误提示“双重释放或损坏”,我不知道是什么原因导致此错误。在我尝试使用cod方法计算sir(string)的ASCII码和之后,它应该会返回一个整数值。

我该如何解决这个问题?

最佳答案

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

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)。您在这里缺少==

关于c++ - 尝试计算 “sir”(string)类的ASCII码和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30648638/

10-10 00:56