2010-01-18 93 views
2

我得到以下简化的代码存储器分配错误(和随后的崩溃):查找内存分配错误

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。

+0

您有完整的测试案例,我们可以尝试一下吗? – outis 2010-01-18 10:17:24

+0

MyType是否包含任何指针成员变量?在这种情况下,复制ctor和赋值运算符写入正确吗? – Naveen 2010-01-18 10:18:37

+0

outis:不,对不起。我无法提供。 Naveen:没有指针成员变量。 – 2010-01-18 10:28:37

回答

2

终于找到了错误。

我们使用上述功能作为使用OpenSSL的更大套接字通信的一部分(因此参考上文)。按照上述代码简化,套接字正在写入数据并读取数据。

插座被读取的是,我们从一个缓冲区(动态改变大小)重新分配内存以另一种方式。在这样做的时候,我们使用缓冲区的输入和我们应该扩展的大小。大小计算使用模数来计算重新大小的因子。这导致缓冲区太大或太小,不适合以下操作。

两天的调试将'%'更改为'/'。

感谢您的支持,不过。

+0

我有一种感觉,你不使用断言或大量的日志记录。你打算如何保持代码兽在你的皮带之下? – 2010-01-20 02:58:15

+1

我们正在使用断言和日志记录。在这种情况下或者在这个特定的部分,我们根本没有这样的东西。感觉就像你试图挑战... – 2010-01-21 00:28:59

+0

+1对于简单的错误,需要不成比例的努力来解决。很高兴知道编程从不改变其核心。 – outis 2010-01-21 04:18:29

0

ReadFromFuncThatMayBeProblem()返回什么类型?它是否返回一个(const)引用?如果是这样,该对象在离开ReadFromFuncThatMayBeProblem()的范围后仍然有效吗?

+0

它返回成员的类型(std :: wstring,long等)。 (非常量) – 2010-01-19 09:10:21