读书人

C++中析构函数失误Damage:after nor

发布时间: 2013-04-21 21:18:07 作者: rapoo

C++中析构函数出错,Damage:after normal block,找了好久,没有溢出啊。
#include <iostream>
using namespace std;
#include "cmath"

#define N 10


double score[] = {1,2,3,4,5,6,7,8,9,10} ;
class ZScore
{
public:
ZScore(double tmp_score[], double tmp_a, double tmp_b) ;
//~ZScore() ;
void free() ;
void CalZScore() ;
double GetAbility(int i) ;

private:
double *Score ;
double *Ability ;
double var_a ;
double var_b ;
double avg_x ;
double tmp_sum ;
double tmp_s ;

};

ZScore::ZScore(double tmp_score[], double tmp_a, double tmp_b)
{
Score = tmp_score ;
Ability = new double(sizeof(score) / sizeof(double)) ;
var_a = tmp_a ;
var_b = tmp_b ;
avg_x = 0 ;
tmp_s = 0 ;
tmp_sum = 0 ;
}


/*ZScore::~ZScore()
{
delete [] Ability ;
cout<<"Destruction succeed!"<<endl ;
}*/
void ZScore::free()
{
delete [] Ability ;
}


double ZScore::GetAbility(int i)
{
return Ability[i] ;
}


// 计算各学生标准分

void ZScore::CalZScore()
{
for ( int i = 0; i < N; i++) // 计算全体学生总分
{
tmp_sum += Score[i] ;
}

avg_x = tmp_sum / N ; // 计算平均分

for ( i = 0; i< N; i++) // 计算方差
{
tmp_s += pow((Score[i] - avg_x),2) ;
}

tmp_s = sqrt(tmp_s / N) ; // 计算标准差

for ( i = 0; i < N; i++) // 计算标准分Z,进行将标准分进行线性转换,并存入Ability数组
{
Ability[i] = (Score[i] - avg_x) / tmp_s ;
Ability[i] = var_a * Ability[i] + var_b ;
}

/*for ( i = 0; i < N; i++) // 计算标准分Z,进行将标准分进行线性转换,并存回原数组Score
{
Score[i] = (Score[i] - avg_x) / tmp_s ;
Score[i] = var_a * Score[i] + var_b ;
}*/
}
int main()
{
ZScore zscore(score,1,1) ;
zscore.CalZScore() ;
for ( int i = 0; i < N; i++)
{
cout<<"score["<<i<<"] is "<<score[i]<<endl;
}

for ( i = 0; i < N; i++)
{
cout<<"Ability["<<i<<"] is "<<zscore.GetAbility(i)<<endl;


}

zscore.free() ;

return 0;
}
[解决办法]
Ability = new double(sizeof(score) / sizeof(double)) ;

你知道这是什么吗?
这是 new 1 个double, 它的值是 10
改成
Ability = new double[sizeof(score) / sizeof(double)] ;

读书人网 >C++

热点推荐