gpt4 book ai didi

检测到 C++ 堆损坏 - CRT

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

我有一个 BYTE 数组,如下所示:

BYTE* m_pImage;
m_pImage = new BYTE[m_someLength];

在我的程序的不同阶段,数据被复制到这个数组中,如下所示:

BYTE* pDestinationBuffer = m_pImage + m_imageOffset;
memcpy( pDestinationBuffer, (BYTE*)data, dataLength );

但是当我像这样删除我的缓冲区时:

delete[] m_pImage;

我得到了检测到堆损坏 - CRT 检测到应用程序在堆缓冲区结束后写入内存

现在我已经尝试了一个简单的程序来尝试复制错误,以帮助我调查发生了什么。我从下面看到,如果我创建一个大小为 5 的数组,但写在它的末尾并尝试删除它,我会得到完全相同的错误。

int* myArray = new int[5];
myArray[0] = 0;
myArray[1] = 1;
myArray[2] = 2;
myArray[3] = 3;
myArray[4] = 4;
myArray[5] = 5; // writing beyond array bounds

delete[] myArray;

现在我的问题是如何调试或找出覆盖原始缓冲区的内容。我知道有些东西正在覆盖缓冲区的末尾,所以 visual studio 有没有办法帮助我轻松调试它。

上面复制到数据缓冲区的代码在删除之前被调用了几次,因此很难跟踪 m_pImage 的内容和复制到它的数据。 (大约2M的数据)

最佳答案

Now my question is how can I possibly debug or find out what is overwriting my original buffer.

我建议尽可能使用assert() 语句。在这种情况下,它应该是:

BYTE* pDestinationBuffer = m_pImage + m_imageOffset;
assert( dataLength + m_imageOffset <= m_someLength );
memcpy( pDestinationBuffer, (BYTE*)data, dataLength );

然后编译进入 Debug模式并运行。此方法的好处 - 在 Release模式下不会有任何开销,在该模式下不评估断言。

关于检测到 C++ 堆损坏 - CRT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26264779/

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