gpt4 book ai didi

c++ - 如何解决 C++ 中的 flsgetvalue() 堆损坏问题?

转载 作者:行者123 更新时间:2023-11-28 08:13:52 26 4
gpt4 key购买 nike

我有一个输出函数,它通过循环将一些参数写入文件。在它崩溃之前我多次调用该函数并且它正常运行。循环返回“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;
}

main 的初始化是:

    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;
}
}
}

我怎样才能避免这个问题??

注意:如果我在没有调试的情况下运行程序,那么错误就会消失。

编辑:问题的详细描述:我多次使用上述函数生成输出文件。我向函数发送参数,包括一个动态整数 vector ,并在每次迭代时向其中写入一个数字。在使用一组参数执行此函数期间,它给出堆损坏错误“检测到严重错误 c0000374”。奇怪的是它不会给其他实例带来错误。

最佳答案

抱歉,如果没有可重现的代码,我无法帮助您。我没有调用堆栈,我没有数据可以发送到你的函数中,我没有可以编译和运行的工作代码。您在这里使用的标准库几乎是防弹的。这意味着问题很可能是您自己的。

要调试它,我会这样做:

  1. 通过注释掉代码,将您的代码减少到基本为零。
  2. 通过执行一个基本的 shell 让代码运行到最后。确保它运行无误。
  3. 在 visual studio 中,打开调试菜单选项中的所有“异常中断”。这也称为“第一次机会中断”异常。
  4. 一次一行取消对代码的注释,然后运行它直至完成。确保它运行无误。
  5. 重复第 4 步,直到取消注释所有代码。
  6. 确保您的调试配置链接到调试库,您的发布配置链接到发布库。

关于c++ - 如何解决 C++ 中的 flsgetvalue() 堆损坏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8278046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com