Memory leaks at c_str() of std::string
CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 5 of 5

Thread: Memory leaks at c_str() of std::string

  1. #1
    Join Date
    Mar 2010
    Posts
    5

    Question Memory leaks at c_str() of std::string

    Hello All,


    I develop MFC Extension DLL and I have an problem with Memory leaks issue. I try
    to use the The User-Mode Dump Heap (UMDH) tool, Umdh.exe that come with Microsoft debugging tools

    After I used umdh.exe to checked the Heap I found this

    #1


    + 419737 ( 875104 - 455367) 30099 allocs BackTrace3379
    + 14439 ( 30099 - 15660) BackTrace3379 allocations

    ntdll!RtlpNtMakeTemporaryKey+000074CE
    ntdll!LdrAlternateResourcesEnabled+00002B05
    ntdll!RtlDosSearchPath_Ustr+00000310
    MSVCR90!malloc+00000079
    mfc90!???+00000000 : 78637550
    mfc90!???+00000000 : 7862F967
    mfc90!???+00000000 : 7862FA1E
    mfc90!???+00000000 : 7862FA75
    mfc90!???+00000000 : 7862F704
    mfc90!???+00000000 : 7862F636
    mfc90!???+00000000 : 7862F650
    mfc90!???+00000000 : 7862F66C
    mfc90!???+00000000 : 786350AD
    MyDLL!CParser::ParseRecord3+00000A7C (x:\projects\folder\branchs\folder2008\folder2008_newway\source\Parser.cpp, 333)


    and I look into the line of code and found this


    p_RecordSummaryImp->OperValue = (*iter).GetFormattedValue().c_str();



    the full code is look something like below

    for (VDetail::const_iterator iter = (*pfo).begin(); iter!=iterEnd; ++iter)
    {

    p_RecordSummaryImp->OperValue = (*iter).GetFormattedValue().c_str();


    }


    and (*iter).GetFormattedValue() will return the std::string type
    and p_RecordSummaryImp->OperValue, the OperValue is a CString type.

    My question is Why the c_str() cause the memory leaks? and how to fix it. All suggestion are welcome



    -----------------------------------------------------------------------------------------------------------
    #2
    the stack that got from umdh.exe :

    + 433200 ( 902580 - 469380) 30086 allocs BackTrace336F
    + 14440 ( 30086 - 15646) BackTrace336F allocations

    ntdll!RtlpNtMakeTemporaryKey+000074CE
    ntdll!LdrAlternateResourcesEnabled+00002B05
    ntdll!RtlDosSearchPath_Ustr+00000310
    MSVCR90!malloc+00000079
    mfc90!???+00000000 : 78637550
    mfc90!???+00000000 : 7862F967
    mfc90!???+00000000 : 7862FA1E
    mfc90!???+00000000 : 7862FA75
    mfc90!???+00000000 : 7862F704
    mfc90!???+00000000 : 7862F636
    mfc90!???+00000000 : 7862F650
    mfc90!???+00000000 : 7862F66C
    MyDLL!CParser::ParseRecord3+00000A7C (x:\projects\folder\branchs\folder2008\folder2008_newway\source\Parser.cpp, 287)

    and look at the line 287, I found this code

    p_RecordSummaryImp->OPort = atoi(PPacket->szSrcPort);

    p_RecordSummaryImp->OPort is a int type and the PPacket->szSrcPort is TCHAR szSrcPort[64]; and PPacket is a structure type.

    Why the line is cause the memory leaks problem ? or I misunderstand about the umdh.exe result that I got above. All suggestion are welcome



    Thanks for your help.
    Sirichai

  2. #2
    Join Date
    Feb 2002
    Posts
    4,640

    Re: Memory leaks at c_str() of std::string

    What is 'GetFormattedValue()' returning exactly? A string? Or a reference to a string? The only reason I ask is that if it's returning a string object, that object is temporary, and is destroyed after this line of code is executed. That means that any address returned by 'c_str' will be invalid after the line is done. So, 'p_RecordSummaryImp->OperValue' will contain an invalid value.

    Viggy

  3. #3
    Join Date
    Mar 2010
    Posts
    5

    Re: Memory leaks at c_str() of std::string

    Thanks for your reply.


    As for you question.


    string GetFormattedValue() const { return m_strVal; };


    and

    private:
    string m_strVal;

  4. #4
    Join Date
    Feb 2002
    Posts
    4,640

    Re: Memory leaks at c_str() of std::string

    That's what I suspected. The return value is a copy of the string, and is temporary. After the line of code is executed, 'p_RecordSummaryImp->OperValue' is invalid.

    Either make the return value a reference:
    Code:
    string &GetFormattedValue() const { return m_strVal; };
    Or, make 'p_RecordSummaryImp->OperValue' a string (not a const char *).

    Viggy

  5. #5
    Join Date
    Mar 2010
    Posts
    5

    Talking Re: Memory leaks at c_str() of std::string

    Thanks you very much MrViggy.

    Yes you are right and it's work.


    And are you know about the second problem? or any suggestion?

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  


Azure Activities Information Page

Windows Mobile Development Center


Click Here to Expand Forum to Full Width

This is a CodeGuru survey question.


Featured


HTML5 Development Center