Как решить flsgetvalue () повреждение кучи в C ++? - PullRequest
0 голосов
/ 26 ноября 2011

У меня есть функция вывода, которая записывает некоторые параметры в файл с циклом. Я вызываю функцию несколько раз, прежде чем она падает, и она функционирует должным образом. Цикл возвращает количество раз, указанное в параметре «count». Когда счетчик равен 6000, он падает на 5960. Функция не дает сбой при предыдущих вызовах, которые передают функцию более низкому счету.

Ошибка отсылает меня к tidtable.c и указывает на строки:

_CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue()
{
#ifdef _M_IX86
    PFLS_GETVALUE_FUNCTION flsGetValue = FLS_GETVALUE; // <---exactly Here
    if (!flsGetValue)
    {
        flsGetValue = DecodePointer(gpFlsGetValue);
        TlsSetValue(__getvalueindex, flsGetValue);
    }
    return flsGetValue;

Я инициализирую единственный динамически назначенный параметр pntr в функции, используя следующий шаблон:

template <typename T>
T *AllocateDynamicVector(int nRows){
    T *dynamicArray;

    dynamicArray = new T[nRows];
    for( int i = 0 ; i < nRows ; i++ ){
        dynamicArray[i]= 0;
    }
    return dynamicArray;
}

Инициализация от основной:

    int* pntrPlane     = AllocateDynamicVector<int>(2*numberOfCells);
Writer(myfile,ss,"123","0","0","1","0","0","0","1","0",2*numberOfCells,lineInfo,1,pntrPlane);

Код указан ниже:

void Writer (ofstream &myfile, stringstream &ss, std::string type, std::string id1, std::string id2, std::string id3,
       std::string id4,std::string id5,std::string id6,std::string id7,std::string id8, int count, 
       int lineInfo[2], int lineNum, int* pntr){
           if(myfile.is_open()){
               for (int i=0; i < count; i++){
                   if (type == "123"){
                       cout<<"I'm here!"<<" "<<i<<endl;
                   }
                   ss.seekp(0);
                   ss<<setw(80)<<lineInfo[0]; ss.seekp(0);
                   ss<<setw(73)<<"1D"; ss.seekp(0);
                   ss<<setw(56)<<id1.c_str(); ss.seekp(0);
                   ss<<setw(48)<<id2.c_str(); ss.seekp(0);
                   ss<<setw(40)<<id3.c_str(); ss.seekp(0);
                   ss<<setw(32)<<id4.c_str(); ss.seekp(0);
                   ss<<setw(24)<<id5.c_str(); ss.seekp(0);
                   ss<<setw(16)<<lineInfo[1]; ss.seekp(0);
                   ss<<setw(8)<<type.c_str(); ss.seekp(0);
                   myfile<<ss.str()<<endl; ss.clear();
                   pntr[i] = lineInfo[0];
                   lineInfo[0]++;
                   ss.seekp(0);
                   ss<<setw(80)<<lineInfo[0]; ss.seekp(0);
                   ss<<setw(73)<<"0D"; ss.seekp(0);
                   ss<<setw(40)<<id6.c_str(); ss.seekp(0);
                   ss<<setw(32)<<lineNum; ss.seekp(0);
                   ss<<setw(24)<<id8.c_str(); ss.seekp(0);
                   ss<<setw(16)<<"0"; ss.seekp(0);
                   ss<<setw(8)<<type.c_str(); ss.seekp(0);
                   myfile<<ss.str()<<endl; ss.clear();
                   lineInfo[0]++;
                   lineInfo[1] = lineInfo[1] + lineNum;
               }
           }
}

Как мне избежать этой проблемы ??

Примечание. Если запустить программу без отладки, ошибка исчезнет.

Редактировать: подробное описание проблемы: я генерирую выходной файл, используя функцию выше несколько раз. Я посылаю параметры в функцию, включая динамический целочисленный вектор, и записываю число в нее на каждой итерации. При выполнении этой функции с набором параметров выдается ошибка повреждения кучи «Обнаружена критическая ошибка c0000374». Странно то, что это не дает ошибок в других случаях.

1 Ответ

1 голос
/ 26 ноября 2011

Извините, но без воспроизводимого кода я не могу вам помочь.У меня нет стека вызовов, у меня нет данных для отправки в вашу функцию, у меня нет рабочего кода, который я могу скомпилировать и запустить.Вы используете стандартные библиотеки здесь, которые в значительной степени пуленепробиваемые.Это означает, что проблема, скорее всего, ваша.

Для отладки я бы сделал следующее:

  1. Сократите ваш код до нуля, закомментировав код.
  2. Получить код до конца, выполнив базовую оболочку.Убедитесь, что он работает без ошибок.
  3. В Visual Studio включите все «исключения по прерываниям» в опциях меню отладки.В противном случае это называется разрывом при первом исключении.
  4. Раскомментируйте код по одной строке за раз и запустите его до конца.Убедитесь, что он работает без ошибок.
  5. Повторяйте шаг 4, пока не раскомментируйте весь свой код.
  6. убедитесь, что ваша конфигурация отладки связана с библиотеками отладки, а ваша конфигурация выпуска связана с библиотеками выпуска.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...