Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Exception Handling & Memory Leak (http://www.velocityreviews.com/forums/t284528-exception-handling-and-memory-leak.html)

Bikash 07-22-2004 07:12 AM

Exception Handling & Memory Leak
 
Hello,

I am a specific problem in exception handling. The code snippets is
attached below.

void f()
{
char *ptr = new char(20);
throw 2;
}

void main(void)
{
try
{
f();
}
catch(...)
{
}
}

The above function calls shows that a memory has been allocated to
char * pointer. With the throw statment in the subsequent line states
that there will be memory leak in this time of situation. I just
wanted to know is there any method to free the memory allocated in the
catch(...) block.

Regards
Bikash

rokia 07-22-2004 08:04 AM

Re: Exception Handling & Memory Leak
 
finnaly()
{
}

or use deconstructor .



John Harrison 07-22-2004 08:19 AM

Re: Exception Handling & Memory Leak
 

"Bikash" <b_srivastava@hotmail.com> wrote in message
news:d24a5b2a.0407212312.66afaa9c@posting.google.c om...
> Hello,
>
> I am a specific problem in exception handling. The code snippets is
> attached below.
>
> void f()
> {
> char *ptr = new char(20);
> throw 2;
> }
>
> void main(void)
> {
> try
> {
> f();
> }
> catch(...)
> {
> }
> }
>
> The above function calls shows that a memory has been allocated to
> char * pointer. With the throw statment in the subsequent line states
> that there will be memory leak in this time of situation. I just
> wanted to know is there any method to free the memory allocated in the
> catch(...) block.
>


No there isn't.

Don't use raw pointers, put your pointers in classes instead. Classes can
have destructors and so can free the memory of any pointers they hold.

john



Peter van Merkerk 07-22-2004 08:21 AM

Re: Exception Handling & Memory Leak
 
Bikash wrote:

> Hello,
>
> I am a specific problem in exception handling. The code snippets is
> attached below.
>
> void f()
> {
> char *ptr = new char(20);
> throw 2;
> }
>
> void main(void)
> {
> try
> {
> f();
> }
> catch(...)
> {
> }
> }
>
> The above function calls shows that a memory has been allocated to
> char * pointer. With the throw statment in the subsequent line states
> that there will be memory leak in this time of situation. I just
> wanted to know is there any method to free the memory allocated in the
> catch(...) block.


If it is acceptable that the memory is freed when the f() is left via an
exception (i.e. before it enters the catch(...) block) you could use
std::auto_ptr class or a more sophisticated smart pointer like the ones
in the boost library (http://boost.org/). You may also want look at the
RAII idiom, this idiom is essential if you want to write exception safe
code.


--
Peter van Merkerk
peter.van.merkerk(at)dse.nl

Peter van Merkerk 07-22-2004 08:23 AM

Re: Exception Handling & Memory Leak
 
rokia wrote:

> finnaly()
> {
> }



Even though many compilers support it 'finally' is not standard C++.
However the RAII idiom is an excellent alternative for finally.

--
Peter van Merkerk
peter.van.merkerk(at)dse.nl

Daniel T. 07-22-2004 12:23 PM

Re: Exception Handling & Memory Leak
 
In article <d24a5b2a.0407212312.66afaa9c@posting.google.com >,
b_srivastava@hotmail.com (Bikash) wrote:

>Hello,
>
>I am a specific problem in exception handling. The code snippets is
>attached below.
>
>void f()
>{
> char *ptr = new char(20);
> throw 2;
>}
>
>void main(void)
>{
> try
> {
> f();
> }
> catch(...)
> {
> }
>}
>
>The above function calls shows that a memory has been allocated to
>char * pointer. With the throw statment in the subsequent line states
>that there will be memory leak in this time of situation. I just
>wanted to know is there any method to free the memory allocated in the
>catch(...) block.


There would be a memory leak in any case because no part of the code
even makes the attempt to delete the memory allocated... Maybe a more
resonable example?

void function_that_may_throw();

int main() {
try {
char* ptr = new char( 20 );
function_that_may_throw();
delete ptr;
}
catch ( ... ) { }
}

In this, the solution is to use an auto_ptr:

int main() {
try {
auto_ptr<char> ptr( new char( 20 ) );
function_that_may_throw();
}
catch ( ... ) { }
}

Other examples may call for other solutions, but in all casses RAII is
the way to go. Do a google search on "RAII".


All times are GMT. The time now is 10:07 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.