#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/