gpt4 book ai didi

c++ - 多次迭代后的 BadPtr

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

C++。它可能更多的是在 Visual Studio 中调试和使用内存的问题。

我有一个分析文件列表的程序,当前文件的路径是字符串的串联:名为“文件夹”的 CString 对象和文件名本身(也是 CString)。

但是在第 144 次迭代之后(我确定这个数字不重要),文件夹突然变成了 BadPtr 并且应用程序因访问冲突而崩溃。为了检查,我创建了一个具有相同目录的 CFileFind 对象,而不是与文件夹连接,而是与 finder.GetRoot() 连接。同样的故事,第 144 次迭代和崩溃。

问题是,我如何保护这个变量的内存(在第 144 次迭代之前没问题)或跟踪实际写入该位置的函数或其他任何东西来调试这个问题。在循环过程中,文件夹变量根本没有改变。实际上它在某个类的私有(private)部分中,出现在循环中的所有函数都无法访问这个私有(private)部分。

代码是这样的(可能会有一些错别字因为我删掉了一些不重要的东西):

typedef map<CString, list< CRect > > metadata;
...
metadata::iterator it=mt.begin();
list< CRect >::iterator it_l;
float i=0;

while(it!=mt.end()){
if(cur.Load(folder+"\\"+(*it).first+".jpg")){
it_l=(*it).second.begin();
i+=1.0;
while(it_l!=(*it).second.end()){
cur.buildVector(*it_l);
cur.printVector(mf,',');
mf<<",1"<<"\n";
it_l++;
}
}
it++;
}

buildVector 收集当前图像的 CRect 对象中的特征,cur.Load 加载图像 itsef,printVector 打印 vector 到名为 mf 的 ofstream。我计算迭代次数。

更新:我检查了我的代码,对除 cur.Load(...) 之外的所有行进行了注释,但仍然发生崩溃,但发生在第 584 次迭代时。看起来像是它的覆盖内存问题。我查看了 Load 中的所有函数:

    bool Image::Load(CString& path){
if(!src.IsNull()){
src.Destroy();
}
src.Load(path);
width=src.GetWidth();
height=src.GetHeight();
fillBrightnessMatrix();
fillGradientMatrices();
return true;
}

并发现注释 fillBrightnessMatrix() 可以使迭代通过列表的末尾而不会出现任何错误。这个函数是唯一一个与内存一起工作的函数,这里是它的代码:

 void Image::fillBrightnessMatrix(){
const int nPitch = src.GetPitch();

const unsigned int nWidth = src.GetWidth();
const unsigned int nHeight = src.GetHeight();
BYTE * pxPixel = reinterpret_cast<BYTE*>(src.GetBits());


for(int nY = 0; nY < nHeight; ++nY)
{
for(int nX = 0; nX < nWidth; ++nX)
{
pxPixel += 3;
bright[nX][nY]=((*pxPixel+*(pxPixel+1)+*(pxPixel+2))/3.0)/255.0;
};

if(nPitch >= 0)
pxPixel += nPitch - (nWidth*3);
else
pxPixel -= ((nWidth*3) + (nPitch*(-1)));
};
}

bright 在构造函数中分配,它的 double[500][500]。实际上,我在这段代码中没有看到任何内存泄漏,我做错了什么?

现在调试器指向这一行:

bright[nX][nY]=((*pxPixel+*(pxPixel+1)+*(pxPixel+2))/3.0)/255.0;

说 pxPixel 是 BadPtr >。<该死的我什么都不懂。

最佳答案

我没有看过您的代码,但这闻起来像是有人越界写入数据。要捕捉这样的东西:

  • 让您的循环运行到第 143 次迭代。 (使用条件断点在第 143 次中断。)检查您的文件夹以确保它仍然正常。
  • 在其数据地址上设置数据断点。 (我不知道 CString,所以我没法帮你。)
  • 单步执行代码。
  • 当数据断点命中时,查看堆栈以了解发生了什么。

关于c++ - 多次迭代后的 BadPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4013045/

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