我得到以下简化的代码存储器分配错误(和随后的崩溃):查找内存分配错误
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()是罪魁祸首,但它是一个相当复杂的功能,我不能在这里devulge。
而且,这是一个已经工作(或至少出现工作)之前,应用程序的其他部分被移植到使用OpenSSL代码。不过,我不知道这可能是否有效。
所以,我能做些什么来追查这个分配错误,因为我假定上面的代码其实也不是什么问题?
编辑:更多信息: 没有为MyType的没有析构函数。
但是,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。
您有完整的测试案例,我们可以尝试一下吗? – outis 2010-01-18 10:17:24
MyType是否包含任何指针成员变量?在这种情况下,复制ctor和赋值运算符写入正确吗? – Naveen 2010-01-18 10:18:37
outis:不,对不起。我无法提供。 Naveen:没有指针成员变量。 – 2010-01-18 10:28:37