1

私は次のコードを持っています:

std::vector<double> thickness(61);
std::vector<double> hThickness(61);
std::vector<double> samplesAfterMueller(61);

私の機能の一番上に。実行した後、ヒープが破損してクラッシュし、その理由と方法がわかりませんでした。

これらの行に絞り込んで変更しました

std::vector<double> thickness; thickness.resize(61);
std::vector<double> hThickness; hThickness.resize(61);
std::vector<double> samplesAfterMueller; samplesAfterMueller.resize(61);

これで動作します。なんで?std::vector<double> myVector(size);初期化中にすでに特定のサイズを初期化する必要があると思いましたか?

注: その関数を実行しなくても、ヒープの破損はなく、コードには解放されていないメモリがないため、実際にはこれらの行に要約されます。

編集:完全な機能

int PMNFL::CalcMatchesFixedRadius(float* input, DataPair mData, int w, float radius, float& error, float& veneOffset, bool leftEye)
{
    double cosinus = cos(2*mData.angle);
    double sinus = sin(2*mData.angle);

    // Uncommend to fix heap corruption
    /*std::vector<double> thickness; thickness.resize(61);
    std::vector<double> hThickness; hThickness.resize(61);
    std::vector<double> samplesAfterMueller; samplesAfterMueller.resize(61);*/

    // Uncomment to cause heap corruption
    std::vector<double> thickness(61);
    std::vector<double> hThickness(61);
    std::vector<double> samplesAfterMueller(61);

    float bestHit = 50000.0f;
    float last = 60000.0f;
    int cVal = 2;

    int da = (fabs(mData.deltaAngle))>10?10:(int)(fabs(mData.deltaAngle)+0.5f);

    for(int i = 0; i < 61; ++i)
    {
        samplesAfterMueller.at(i) = 0.0;
        double radum = radius * 10.0;
        double value = pow(radum,2) - 100.0 * pow(double(30-i), 2); // Pythagoras
        if(value < 0)
        {
            hThickness.at(i) = 0.0;
            continue;
        }
        hThickness.at(i) = sqrt(value) + radum;
    }

    double amplitude = pow((radius * 10.0), 2) * (2 + PI / 2) / (40 * w);
    double frequency = (2*PI / (40*w));
    for(int i = 0; i < 61; ++i)
    {
        if(i > 30 - 2*w && i < 30 + 2*w)
            thickness.at(i) = mData.nflThickness + amplitude + amplitude * (-cos(frequency * (2*w - i) * 10));
        else
            thickness.at(i) = mData.nflThickness;
    }

    int posR = ((int)(mData.distRad + 2.5f) / 5) * 5;
    if(posR < 0)
        posR = 0;

    if(posR > 245)
        posR = 245;

    int baseOffset = da * 1269 * 61;
    if(posR > 0)
    {
        baseOffset += (posR / 5 - 1) * 11 * 1269 * 61;
    }

    const double min_R = 2.0; //the minimum radius
    const double step_R = 0.5;//step size of radius;
    int iR = (int)floor((radius-min_R)/step_R); //=16th block.

    int line = baseOffset + iR*(31+16);

    for(int k = 0; k < 16; ++k)
    {
        int index = line + k*61;
        for(int i = 0; i < 61; ++i)
        {
            double retardance = 0.62 * thickness.at(i);
            double retardancePhase = 2*PI*retardance/532.0;
            double M11 = pow(cosinus,2) + pow(sinus,2) * cos(retardancePhase);
            double Ic = fSamples.at(index+i) * (1-M11)/2;
            samplesAfterMueller.at(i) += Ic;
        }
    }

    float* adapted = new float[4*w+1];

    for(int i = 0; i < 4*w+1; ++i)
    {
        adapted[i] = input[4*w-i];
    }

    std::vector<double> simData(61);

    for(int c = 0; c < 30; ++c)
    {
        for(int i = 0; i < 61; ++i)
        {
            simData.at(i) = samplesAfterMueller.at(i) + fSamples.at(line+16*61+c*61+i)/2;
        }

        last = GetSADFloatRel(adapted, &simData.at(30-2*w), 4*w+1, 4*w+1, 0);
        if(bestHit > last)
        {
            bestHit = last;
            cVal = c * 2;
        }

        last = GetSADFloatRel(input, &simData.at(30-2*w), w * 4 + 1, w * 4 + 1, 0);
        if(bestHit > last)
        {
            bestHit = last;
            cVal = c * 2;
        }
    }

    error = bestHit;
    delete adapted;
    return cVal;
}
4

1 に答える 1