C++ 错误c0000374&;堆损坏时触发的断点

C++ 错误c0000374&;堆损坏时触发的断点,c++,debugging,heap-memory,C++,Debugging,Heap Memory,我正在尝试实现一个插件,该插件连接到RTI进行数据编码/解码。不幸的是,我遇到了一些堆问题,我没有线索知道是什么导致了这些问题 以下是我收到的错误: 检测到严重错误c0000374 中0x00007FFB6AF59059(ntdll.dll)处未处理的异常 FederatePublisher.exe:0xC0000374:堆已损坏 (参数:0x00007FFB6AFC27F0) 下面是触发它的代码: wstring childDataType = basicType->getName();

我正在尝试实现一个插件,该插件连接到RTI进行数据编码/解码。不幸的是,我遇到了一些堆问题,我没有线索知道是什么导致了这些问题

以下是我收到的错误:

检测到严重错误c0000374

中0x00007FFB6AF59059(ntdll.dll)处未处理的异常 FederatePublisher.exe:0xC0000374:堆已损坏 (参数:0x00007FFB6AFC27F0)

下面是触发它的代码:

wstring childDataType = basicType->getName();
...
else if (childDataType.compare(L"RPRunsignedInteger16") == 0)
{    
    for (char* ptr = (char*)data; ptr < (char*)data + sizeof(__int16); ptr++)
    {
        buffer.push_back(*ptr); //HERE IT IS TRIGGERED
    }
    return;
}
这个错误是完全随机的,通常发生在程序运行的开始,但并不总是在同一个位置,有时它运行平稳,直到我手动停止测试程序。我通过给它一个完整的类和属性来测试它,它们是否未初始化并不重要,因为即使是随机值也应该正确编码

以下是我得到的调用堆栈:

ntdll.dll!RtlReportCriticalFailure()    Unknown
ntdll.dll!RtlpHeapHandleError() Unknown
ntdll.dll!RtlpHpHeapHandleError()   Unknown
ntdll.dll!RtlpLogHeapFailure()  Unknown
ntdll.dll!RtlpFreeHeapInternal()    Unknown
ntdll.dll!RtlFreeHeap() Unknown
ucrtbased.dll!_free_base(void * block) Line 105 C++
ucrtbased.dll!free_dbg_nolock(void * const block, const int block_use) Line 1003    C++
ucrtbased.dll!_free_dbg(void * block, int block_use) Line 1030  C++
FederatePublisher.exe!operator delete(void * block) Line 38 C++
FederatePublisher.exe!operator delete(void * block, unsigned __int64 __formal) Line 32  C++
FederatePublisher.exe!std::vector<char,std::allocator<char>>::_Change_array(char * const _Newvec, const unsigned __int64 _Newsize, const unsigned __int64 _Newcapacity) Line 1904   C++
FederatePublisher.exe!std::vector<char,std::allocator<char>>::_Emplace_reallocate<char const &>(char * const _Whereptr, const char & <_Val_0>) Line 981 C++
FederatePublisher.exe!std::vector<char,std::allocator<char>>::emplace_back<char const &>(const char & <_Val_0>) Line 922    C++
FederatePublisher.exe!MakAgent::encodeAttribute(ObjectClassInstance * obj, BasicDataType * basicType, void * data, std::vector<char,std::allocator<char>> & buffer) Line 1268   C++
FederatePublisher.exe!MakAgent::encodeAndUpdateAttributes() Line 1084   C++
FederatePublisher.exe!Mak::PostExec() Line 86   C++
FederatePublisher.exe!main() Line 30    C++
ntdll.dll!RtlReportCriticalFailure()未知
ntdll.dll!RtlpHeapHandleError()未知
ntdll.dll!RtlpHpHeapHandleError()未知
ntdll.dll!RtlpLogHeapFailure()未知
ntdll.dll!RtlpFreeHeapInternal()未知
ntdll.dll!RtlFreeHeap()未知
ucrtbased.dll_自由基(空隙*块)105线C++
ucrtbased.dll!FLULYBGGJNOLOCKORE(空洞* const块,const int Buffe使用)1003 C++
ucrtbased.dll_免费C++(空*块,int块使用)1030 C++
FederatePublisher.exe!运算符删除(空缺*块)行38 C++
FederatePublisher.exe!运算符删除(空缺*块,未签名的,γ64)32行C++
FederatePublisher.exe!STD::向量::OxCueEnLead数组(char * const x NevEC,const un签署αi64 64新尺寸,const un签署αi64 64新容量)1904行C++
FederatePublisher.exe!St::Vector::yEMPTITIORION(CHAR *const,WestEPTR,const char)981行C++
FederatePublisher.exe!STD::向量:EpSchiffBead(const char)922行C++
FederatePublisher.exe!MaCAgent::EnCODE属性(ObjeCaseStule*Obj[BaseData Type,Basic Type,Voo* *数据,STD::向量和缓冲)1268行C++
FederatePublisher.exe!MaCAgent:EnCODE和UpDeDeTebug()1084行C++
FederatePublisher.exe!后继()第86行C++
FederatePublisher.exe!第30行C++

这一角色从来都不是好兆头。为什么C++中的<代码>空>代码>?我不确定你需要一个循环来复制两个字节。当意外写入到允许范围之外的索引时,我也有类似的错误。VS似乎在调试时释放内存时检查这种情况;这使得识别不正确的代码变得不容易……执行C样式转换(如在
(char*)data
中)通常是您做错事的标志。当你有标准的
int16\t
时,为什么要使用非标准类型,如
\uu int16
?@fabian我发现了问题所在,正是因为我在另一个缓冲区中意外写入了超出允许范围的内容。通过注释所有内容并在代码的其他地方创建另一个向量,我发现了这一点,最后我的错误突然出现了。所以谢谢你,你为我指明了正确的方向。
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif //HERE IT BREAKS
}
ntdll.dll!RtlReportCriticalFailure()    Unknown
ntdll.dll!RtlpHeapHandleError() Unknown
ntdll.dll!RtlpHpHeapHandleError()   Unknown
ntdll.dll!RtlpLogHeapFailure()  Unknown
ntdll.dll!RtlpFreeHeapInternal()    Unknown
ntdll.dll!RtlFreeHeap() Unknown
ucrtbased.dll!_free_base(void * block) Line 105 C++
ucrtbased.dll!free_dbg_nolock(void * const block, const int block_use) Line 1003    C++
ucrtbased.dll!_free_dbg(void * block, int block_use) Line 1030  C++
FederatePublisher.exe!operator delete(void * block) Line 38 C++
FederatePublisher.exe!operator delete(void * block, unsigned __int64 __formal) Line 32  C++
FederatePublisher.exe!std::vector<char,std::allocator<char>>::_Change_array(char * const _Newvec, const unsigned __int64 _Newsize, const unsigned __int64 _Newcapacity) Line 1904   C++
FederatePublisher.exe!std::vector<char,std::allocator<char>>::_Emplace_reallocate<char const &>(char * const _Whereptr, const char & <_Val_0>) Line 981 C++
FederatePublisher.exe!std::vector<char,std::allocator<char>>::emplace_back<char const &>(const char & <_Val_0>) Line 922    C++
FederatePublisher.exe!MakAgent::encodeAttribute(ObjectClassInstance * obj, BasicDataType * basicType, void * data, std::vector<char,std::allocator<char>> & buffer) Line 1268   C++
FederatePublisher.exe!MakAgent::encodeAndUpdateAttributes() Line 1084   C++
FederatePublisher.exe!Mak::PostExec() Line 86   C++
FederatePublisher.exe!main() Line 30    C++