Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > strstream Memory Leak

Reply
Thread Tools

strstream Memory Leak

 
 
nithya4u@gmail.com
Guest
Posts: n/a
 
      10-17-2006
I am working on a c++ module, where large amount of data needs to be
written to a stream and str() method is been used to assign the value
of this to the char*. This produces the intended result. But when i run
purify on it i get the following results.

[W] MLK: Memory leak of 8656 bytes from 9 blocks allocated in
strstreambuf::doallocate(void) [Builder.exe]
Distribution of leaked blocks
987 bytes from 1 block of 987 bytes (0x03977ea
980 bytes from 1 block of 980 bytes (0x038ff010)
976 bytes from 1 block of 976 bytes (0x03974cf
969 bytes from 1 block of 969 bytes (0x03969290)
962 bytes from 1 block of 962 bytes (0x03967a00)
960 bytes from 1 block of 960 bytes (0x03965d7
958 bytes from 1 block of 958 bytes (0x038fe38
957 bytes from 1 block of 957 bytes (0x003961f
907 bytes from 1 block of 907 bytes (0x041080b0)
Allocation location
new(UINT,int,char const*,int) [dbgnew.cpp:46]
strstreambuf::doallocate(void) [_strstre.cpp:201]
strstreambuf:verflow(int) [_strstre.cpp:256]
streambuf:sputn(char const*,int) [streamb.cpp:182]
streambuf::sputn(char const*,int) [.\.\streamb.h:187]
ostream::writepad(char const*,char const*)
[ostream.cpp:166]
ostream::<<(char const*) [ostream.cpp:61]
writeInvisibleObject(char *,char *,char *,char const*)
[E:\Builder\src\main.cpp:2499]

This happens at the line where the char* is been assigned to the
strstream variable.

strstream strmvar;
strmvar << dataChar;

char* datadetail = strmvar.str();
delete datadetail;

Initially i assumed the reason to be writing a char* to the strstream
variable. But the error occured when i tried with int even. The purify
results indicate that it if beacuse of a overflow to the strstream var.
As for as my understanding the new memory that is been allocated was
never deleted. Since the program involves a huge amount of data this
could occur. Is the overflow the cause for the leak? Is there a way to
get rid of this leak? I definitely need to remove this as we are
running the code in batch mode for a set of input files. and this may
affect the performance of the application when run continously and may
lead to out of memory error even.

Can someone help me?

 
Reply With Quote
 
 
 
 
mlimber
Guest
Posts: n/a
 
      10-17-2006
http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> I am working on a c++ module, where large amount of data needs to be
> written to a stream and str() method is been used to assign the value
> of this to the char*. This produces the intended result. But when i run
> purify on it i get the following results.
>
> [W] MLK: Memory leak of 8656 bytes from 9 blocks allocated in
> strstreambuf::doallocate(void) [Builder.exe]
> Distribution of leaked blocks
> 987 bytes from 1 block of 987 bytes (0x03977ea
> 980 bytes from 1 block of 980 bytes (0x038ff010)
> 976 bytes from 1 block of 976 bytes (0x03974cf
> 969 bytes from 1 block of 969 bytes (0x03969290)
> 962 bytes from 1 block of 962 bytes (0x03967a00)
> 960 bytes from 1 block of 960 bytes (0x03965d7
> 958 bytes from 1 block of 958 bytes (0x038fe38
> 957 bytes from 1 block of 957 bytes (0x003961f
> 907 bytes from 1 block of 907 bytes (0x041080b0)
> Allocation location
> new(UINT,int,char const*,int) [dbgnew.cpp:46]
> strstreambuf::doallocate(void) [_strstre.cpp:201]
> strstreambuf:verflow(int) [_strstre.cpp:256]
> streambuf:sputn(char const*,int) [streamb.cpp:182]
> streambuf::sputn(char const*,int) [.\.\streamb.h:187]
> ostream::writepad(char const*,char const*)
> [ostream.cpp:166]
> ostream::<<(char const*) [ostream.cpp:61]
> writeInvisibleObject(char *,char *,char *,char const*)
> [E:\Builder\src\main.cpp:2499]
>
> This happens at the line where the char* is been assigned to the
> strstream variable.
>
> strstream strmvar;
> strmvar << dataChar;
>
> char* datadetail = strmvar.str();
> delete datadetail;
>
> Initially i assumed the reason to be writing a char* to the strstream
> variable. But the error occured when i tried with int even. The purify
> results indicate that it if beacuse of a overflow to the strstream var.
> As for as my understanding the new memory that is been allocated was
> never deleted. Since the program involves a huge amount of data this
> could occur. Is the overflow the cause for the leak? Is there a way to
> get rid of this leak? I definitely need to remove this as we are
> running the code in batch mode for a set of input files. and this may
> affect the performance of the application when run continously and may
> lead to out of memory error even.
>
> Can someone help me?


First, you should use std::stringstreams instead of std::strstreams if
at all possible. The latter have been deprecated.

Second, I think your problem might be that you forgot to terminate the
strstream with std::ends:

strstream strmvar;
strmvar << dataChar << ends;

Cheers! --M

 
Reply With Quote
 
 
 
 
Ron Natalie
Guest
Posts: n/a
 
      10-17-2006
(E-Mail Removed) wrote:

>
> strstream strmvar;
> strmvar << dataChar;
>
> char* datadetail = strmvar.str();
> delete datadetail;


delete [] datadetail;

I'm surprised Putrify doesn't give you an explicit error on this
one.
 
Reply With Quote
 
nithya4u@gmail.com
Guest
Posts: n/a
 
      10-17-2006

Ron Natalie wrote:
> (E-Mail Removed) wrote:
>
> >
> > strstream strmvar;
> > strmvar << dataChar;
> >
> > char* datadetail = strmvar.str();
> > delete datadetail;

>
> delete [] datadetail;
>
> I'm surprised Putrify doesn't give you an explicit error on this
> one.


Thanks. Since i am working on Windows probably purify didn't throw an
error on this.

I solved the problem that i had stated. That was because of the failure
to use freeze method. Once i unfreezed the buffer the destructor itself
took care of the deallocation of the strstream variable.

strmvar.rdbuf()->freeze(0);

made me fix the problem. Is this going to be a problem when I port the
application to UNIX? Do I need to make any changes to make it work?

 
Reply With Quote
 
Sunil Varma
Guest
Posts: n/a
 
      10-17-2006

mlimber wrote:
> (E-Mail Removed) wrote:
> > I am working on a c++ module, where large amount of data needs to be
> > written to a stream and str() method is been used to assign the value
> > of this to the char*. This produces the intended result. But when i run
> > purify on it i get the following results.
> >
> > [W] MLK: Memory leak of 8656 bytes from 9 blocks allocated in
> > strstreambuf::doallocate(void) [Builder.exe]
> > Distribution of leaked blocks
> > 987 bytes from 1 block of 987 bytes (0x03977ea
> > 980 bytes from 1 block of 980 bytes (0x038ff010)
> > 976 bytes from 1 block of 976 bytes (0x03974cf
> > 969 bytes from 1 block of 969 bytes (0x03969290)
> > 962 bytes from 1 block of 962 bytes (0x03967a00)
> > 960 bytes from 1 block of 960 bytes (0x03965d7
> > 958 bytes from 1 block of 958 bytes (0x038fe38
> > 957 bytes from 1 block of 957 bytes (0x003961f
> > 907 bytes from 1 block of 907 bytes (0x041080b0)
> > Allocation location
> > new(UINT,int,char const*,int) [dbgnew.cpp:46]
> > strstreambuf::doallocate(void) [_strstre.cpp:201]
> > strstreambuf:verflow(int) [_strstre.cpp:256]
> > streambuf:sputn(char const*,int) [streamb.cpp:182]
> > streambuf::sputn(char const*,int) [.\.\streamb.h:187]
> > ostream::writepad(char const*,char const*)
> > [ostream.cpp:166]
> > ostream::<<(char const*) [ostream.cpp:61]
> > writeInvisibleObject(char *,char *,char *,char const*)
> > [E:\Builder\src\main.cpp:2499]
> >
> > This happens at the line where the char* is been assigned to the
> > strstream variable.
> >
> > strstream strmvar;
> > strmvar << dataChar;
> >
> > char* datadetail = strmvar.str();
> > delete datadetail;
> >
> > Initially i assumed the reason to be writing a char* to the strstream
> > variable. But the error occured when i tried with int even. The purify
> > results indicate that it if beacuse of a overflow to the strstream var.
> > As for as my understanding the new memory that is been allocated was
> > never deleted. Since the program involves a huge amount of data this
> > could occur. Is the overflow the cause for the leak? Is there a way to
> > get rid of this leak? I definitely need to remove this as we are
> > running the code in batch mode for a set of input files. and this may
> > affect the performance of the application when run continously and may
> > lead to out of memory error even.
> >
> > Can someone help me?

>
> First, you should use std::stringstreams instead of std::strstreams if
> at all possible. The latter have been deprecated.
>
> Second, I think your problem might be that you forgot to terminate the
> strstream with std::ends:
>
> strstream strmvar;
> strmvar << dataChar << ends;
>
> Cheers! --M


Once you are done with object of strstream that's strmvar call
freeze(true) on strmvar.
strmvar.freeze(true);
I too had the same problem earlier.
This worked fine.
But change the deprecated strstream to stringstream.

Regards
Sunil

 
Reply With Quote
 
mlimber
Guest
Posts: n/a
 
      10-17-2006

(E-Mail Removed) wrote:
> Ron Natalie wrote:
> > (E-Mail Removed) wrote:
> >
> > >
> > > strstream strmvar;
> > > strmvar << dataChar;
> > >
> > > char* datadetail = strmvar.str();
> > > delete datadetail;

> >
> > delete [] datadetail;
> >
> > I'm surprised Putrify doesn't give you an explicit error on this
> > one.

>
> Thanks. Since i am working on Windows probably purify didn't throw an
> error on this.
>
> I solved the problem that i had stated. That was because of the failure
> to use freeze method. Once i unfreezed the buffer the destructor itself
> took care of the deallocation of the strstream variable.
>
> strmvar.rdbuf()->freeze(0);
>
> made me fix the problem. Is this going to be a problem when I port the
> application to UNIX? Do I need to make any changes to make it work?


As long as you are able to change things, switch to std::stringstreams
without delay, and your problems will all magically go away! (Ok,
that's an exaggeration, but it will likely help since memory management
will be much simpler.)

Cheers! --M

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
cannot find strstream in /usr/include/c++/3.3.3 derek C++ 2 09-29-2004 02:44 AM
use of strstream object of standard lib News For Mohan C++ 1 08-10-2004 02:35 PM
Queries about strstream.h vishnu mahendra C++ 3 04-11-2004 04:06 PM
Use of strstream.h? vishnu mahendra C++ 2 04-06-2004 09:18 PM
strstream question Bpb C++ 1 09-23-2003 07:30 PM



Advertisments