gpt4 book ai didi

堆的 C++ 损坏

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:29 27 4
gpt4 key购买 nike

我有一个简单的同步队列

 template <typename T>

class SynchronisedQueue
{
public:

void Enqueue(const T& data)
{
boost::unique_lock<boost::mutex> lock(queueMutex);
dataQueue.push(data);
conditionVariable.notify_one();
}

T Dequeue()
{
boost::unique_lock<boost::mutex> lock(queueMutex);

while (dataQueue.size()==0)
{
conditionVariable.wait(lock);
}

T result=dataQueue.front(); dataQueue.pop();
return result;
}


private:

std::queue<T> dataQueue; // Use STL queue to store data
boost::mutex queueMutex; // The mutex to synchronise on
boost::condition_variable conditionVariable; // The condition to wait for
};

当我从队列中出队时,有时会损坏堆....

HEAP: Free Heap block ccb1080 modified at ccb13c0 after it was freed

调用堆栈是:

ntdll.dll!76fa5654()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!76f6a554()
ntdll.dll!76f35a70()
ntdll.dll!76fa5eff()
ntdll.dll!76f6a3ba()
ntdll.dll!76f35a70()
msvcr90d.dll!_heap_alloc_base(unsigned int size=1222) Line 105 + 0x28 bytes C
msvcr90d.dll!_heap_alloc_dbg_impl(unsigned int nSize=1186, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x1310ee18) Line 427 + 0x9 bytes C++
msvcr90d.dll!_nh_malloc_dbg_impl(unsigned int nSize=1186, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0, int * errno_tmp=0x1310ee18) Line 239 + 0x19 bytes C++
msvcr90d.dll!_nh_malloc_dbg(unsigned int nSize=1186, int nhFlag=0, int nBlockUse=1, const char * szFileName=0x00000000, int nLine=0) Line 296 + 0x1d bytes C++
msvcr90d.dll!malloc(unsigned int nSize=1186) Line 56 + 0x15 bytes C++
msvcr90d.dll!operator new(unsigned int size=1186) Line 59 + 0x9 bytes C++
x.ax!std::_Allocate<unsigned char>(unsigned int _Count=1186, unsigned char * __formal=0x00000000) Line 43 + 0x9 bytes C++
ax.ax!std::allocator<unsigned char>::allocate(unsigned int _Count=1186) Line 145 + 0xb bytes C++
ax.ax!std::vector<unsigned char,std::allocator<unsigned char> >::_Buy(unsigned int _Capacity=1186) Line 1110 + 0xf bytes C++
ax.ax!std::vector<unsigned char,std::allocator<unsigned char> >::vector<unsigned char,std::allocator<unsigned char> >(const std::vector<unsigned char,std::allocator<unsigned char> > & _Right=[1186](83 'S',50 '2',54 '6',67 'C',162 '¢',4 '',0,0,108 'l',0,0,0,2 '',64 '@',0,0,6 '',14 '',64 '@',0,35 '#',2 '',147 '“',76 'L',114 'r',53 '5',0,0,54 '6',79 'O',78 'N',4 '',0,0,0,0,54 '6',79 'O',78 'N',4 '',0,0,0,0,255 'ÿ',255 'ÿ',255 'ÿ',255 'ÿ',255 'ÿ',255 'ÿ',255 'ÿ',255 'ÿ',106 'j',4 '',0,0,0,0,0,1 '',65 'A',154 'š',3 '',1 '',176 '°',159 'Ÿ',255 'ÿ',240 'ğ',199 'Ç',...)) Line 501 + 0x11 bytes C++
ax.ax!SynchronisedQueue<std::vector<unsigned char,std::allocator<unsigned char> > >::Dequeue() Line 32 + 0xc bytes C++
ax.ax!PPin::FillBuffer(IMediaSample * pSample=0x0cadbea8) Line 225 + 0x12 bytes C++
ax.ax!PPin::DoBufferProcessingLoop() Line 300 + 0x13 bytes C++
ax.ax!CSourceStream::ThreadProc() + 0x13e bytes
ax.ax!CAMThread::InitialThreadProc() + 0x51 bytes
kernel32.dll!753bed6c()
ntdll.dll!76f4377b()
ntdll.dll!76f4374e()

What may cause this heap corruption? How to debug heap corruption errors? Any ideas...

更新:使用示例

// Enqueue
void GetVideoStreams( BYTE *pData)
{
std::vector<BYTE> vecFrame(pData, pData + nLen/sizeof(pData[0]));
IncomingFramesQueue.Enqueue(vecFrame);

}

//Dequeue
void ConsumeVideoStreams()
{

vector<BYTE> data = IncomingFramesQueue.Dequeue();

}

最佳答案

如上所述 - 您的代码和您发布的堆栈跟踪显示正在进行一些内存分配。连同错误消息,我假设堆损坏发生在其他地方并且每次在出队时都会弹出,因为它使用大量内存来复制这些 vector 。

使用一些内存分析工具的评估版(例如 http://www.softwareverify.com/cpp-memory.php )来查找错误。市场上也有一些免费工具(最著名的是 Valgrind),但我不知道有什么免费的适用于 Visual C++ 的好工具。

此外,您可以查看此帖子How to debug heap corruption errors?此处提供有关如何解决此错误的其他方法。

据我目前所见,错误不在您发布的代码中。如果您需要更多帮助,请提供一个包含错误的小型独立示例。


我刚找到一个可能值得一试的免费工具:Dr. Memory .我从 stackoverflow 得到了链接当然。

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

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