代码之家  ›  专栏  ›  技术社区  ›  Fredrik Ullner

查找内存分配错误

  •  2
  • Fredrik Ullner  · 技术社区  · 16 年前

    我得到以下简化代码的内存分配错误(以及随后的崩溃):

    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)发生。

    现在,如果我不考虑错误(使用调试器),继续进行,那么这个值实际上是在映射中输入的。

    我不知道readFromFuncthamaybeoblem()是否是罪魁祸首,但这是一个相当复杂的函数,我不能在此公布。

    此外,这是在应用程序的其他部分被移植到使用openssl之前已经工作(或者至少看起来工作)的代码。不过,我不知道这会不会有什么影响。

    那么,我可以做些什么来跟踪这个分配错误,因为我假设上面的代码实际上不是问题所在?

    编辑:更多信息: MyType没有DTOR。

    但是,mytype的secondtype类型的成员具有void*成员。该类型的析构函数正在删除并为空。构造函数使用m_pdata=new std::wstring( (标准::W字符串 )source.m_pdata));用于字符串。(与其他数据类型类似)。这可能是个问题吗?(删除static_cast<std::wstring*>(m_pdata);)

    MyType的其他成员类型包括std::wstring、unsigned long、bool、enum、structs(其中包括timeb)和secondType。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Fredrik Ullner    16 年前

    终于找到了错误。

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

    读取套接字的方式是将内存从一个缓冲区重新分配到另一个缓冲区(动态地改变大小)。在这样做的同时,我们使用缓冲区的输入和应该扩展的大小。尺寸计算是用模量来计算再尺寸的因子。这导致缓冲区太大或太小,无法容纳以下操作。

    两天的调试,将“%”更改为“/”。

    不过,谢谢大家的支持。

        2
  •  0
  •   nj.    16 年前

    readFromFuncthMaybeProblem()返回什么类型?它是否返回(常量)引用?如果是这样,在离开readFromFuncthamayBeProblem()的范围后,对象是否仍然有效?