我在以下简化代码中遇到内存分配错误(以及随后的崩溃):
std::wstring myKey = L"str_not_actually_constant";
MyType obj;
Read( obj );
std::map<std::wstring, MyType> myMap;
myMap[myKey] = obj; // Sometimes allocation error (1)
...
Read( MyType& obj )
{
obj.member1 = ReadFromFuncThatMayBeProblem();
obj.member2 = ReadFromFuncThatMayBeProblem(); // Sometimes allocation error (2)
/* more members */
}
...
void operator =( const MyType& source )
{
if( this != &source )
{
member1 = source.member1; // std::wstring
member2 = source.member2; // Usually (1) happen on the second member. // std::wstring
/* more members */
}
}
(1) 或 (2) 发生。
现在,如果我不考虑错误(使用调试器)继续继续,则该值确实已输入到映射中。
我不知道 ReadFromFuncThatMayBeProblem() 是否是罪魁祸首,但这是一个相当复杂的函数,我无法在此详述。
此外,这是在应用程序的其他部分被移植到使用 OpenSSL 之前已经工作(或至少看起来工作)的代码。不过,我不知道这是否会对这里产生任何影响。
那么,我可以做些什么来追踪这个分配错误,因为我假设上面的代码实际上不是问题?
编辑:更多信息:MyType 没有 dtor。
但是,MyType 有一个 SecondType 类型的成员,它有一个 void* 成员。这在该类型的析构函数中被删除并为空。构造函数使用 m_pData = new std::wstring( ( (std::wstring )source.m_pData) ); 对于字符串。(其他数据类型也类似)。这可能是个问题吗?(删除 static_cast< std::wstring* >( m_pData );)
MyType 的其他成员类型是 std::wstring、unsigned long、bool、enum、structs(其中包括 timeb)和 SecondType。