Opened 10 years ago

Closed 5 years ago

#7379 closed Bugs (worksforme)

Boost Format strings causing memory leaks

Reported by: Jason Vincent <jason.vincent@…> Owned by: James E. King, III
Milestone: Boost 1.66.0 Component: format
Version: Boost 1.44.0 Severity: Problem
Keywords: format memory leak Cc:

Description

I determined that certain format string used in a boost::wformat object will leak memory. I was using a formatter to convert a value to a floating point value with and without a percent symbol at the end.

The two format strings I was using were:

L"%1$.1f"
  • format with one decimal place of precision
L"%1$.0f %%"
  • format with no decimal places but add a percent sign

I determined that removing the "%%" reduced some of the memory leaks, and removing the "$.1f" or "$.0f" eliminated the remaining memory leaks.

This was done using Boost v 1.44 with Visual Studio 2010 on Win 7 64-bit.

For more context here is part of the code that I can share:

note, mFormatter is a boost::wformat member object

MyObject::MyObject() :
    mNumDecimalPlaces   (1),
    mFormatter          (L"%1$.1f")  //--- THIS LEAKED
{
}


std::wstring MyObject::PercentToString(const FLOAT iMin,
                                       const FLOAT iMax,
                                       const FLOAT iPercent)
{
    FLOAT value = PercentToValue(iMin, iMax, iPercent);

    return boost::str(mFormatter % value); //--- THIS LEAKED
}

Change History (6)

comment:1 by Jan Vonasek <jan.vonasek@…>, 10 years ago

It looks like bad format string. Try to remove leading "1" (L"%$.1f").

comment:2 by Steven Watanabe, 10 years ago

No, the format string is correct. The "%N$" syntax means to read the Nth argument instead of processing the arguments sequentially.

comment:3 by James E. King, III, 5 years ago

Owner: changed from Samuel Krempp to James E. King, III
Status: newassigned

I am unable to reproduce this issue using valgrind by adding the following test to format_test_wstring.cpp:

diff --git a/test/format_test_wstring.cpp b/test/format_test_wstring.cpp
index c30f740..4f9a871 100644
--- a/test/format_test_wstring.cpp
+++ b/test/format_test_wstring.cpp
@@ -29,8 +29,16 @@ int test_main(int, char* [])
       BOOST_ERROR("Basic w-parsing Failed");
   if(str( wformat(L"%%##%#x ##%%1 %s00") % 20 % L"Escaped OK" ) != L"%##0x14 ##%1 Escaped OK00")
       BOOST_ERROR("Basic wp-parsing Failed") ;
-#endif // wformat tests
 
+  // testcase for https://svn.boost.org/trac10/ticket/7379 (for valgrind)
+  wformat wfmt(L"%1$.1f");
+  std::wstring ws = str(wfmt % 123.45f);
+  BOOST_CHECK_EQUAL(ws.compare(L"123.4"), 0);
+  wformat wfmt2(L"%1$.0f %%");
+  std::wstring ws2 = (wfmt2 % 123.45f).str();
+  BOOST_CHECK_EQUAL(ws2.compare(L"123 %"), 0);
+
+#endif // wformat tests
 
   return 0;
 }

The method in which memory leak detection was determined is missing from the original bug report.After building debug and then running valgrind on it, there were no leaks. As such I am resolving this as "worksforme".

comment:4 by James E. King, III, 5 years ago

Milestone: To Be DeterminedBoost 1.66.0
Resolution: invalid
Status: assignedclosed

comment:5 by James E. King, III, 5 years ago

Resolution: invalid
Status: closedreopened

comment:6 by James E. King, III, 5 years ago

Resolution: worksforme
Status: reopenedclosed
Note: See TracTickets for help on using tickets.