试图计算我的 "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)
。您在这里缺少 ==
。
#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)
。您在这里缺少 ==
。