Connecting Tech Pros Worldwide Help | Site Map

Exception Handling & Memory Leak

  #1  
Old July 22nd, 2005, 05:45 PM
Bikash
Guest
 
Posts: n/a
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
  #2  
Old July 22nd, 2005, 05:45 PM
rokia
Guest
 
Posts: n/a

re: Exception Handling & Memory Leak


finnaly()
{
}

or use deconstructor .


  #3  
Old July 22nd, 2005, 05:45 PM
John Harrison
Guest
 
Posts: n/a

re: Exception Handling & Memory Leak



"Bikash" <b_srivastava@hotmail.com> wrote in message
news:d24a5b2a.0407212312.66afaa9c@posting.google.c om...[color=blue]
> 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.
>[/color]

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


  #4  
Old July 22nd, 2005, 05:45 PM
Peter van Merkerk
Guest
 
Posts: n/a

re: Exception Handling & Memory Leak


Bikash wrote:
[color=blue]
> 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.[/color]

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
  #5  
Old July 22nd, 2005, 05:45 PM
Peter van Merkerk
Guest
 
Posts: n/a

re: Exception Handling & Memory Leak


rokia wrote:
[color=blue]
> finnaly()
> {
> }[/color]


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
  #6  
Old July 22nd, 2005, 05:45 PM
Daniel T.
Guest
 
Posts: n/a

re: Exception Handling & Memory Leak


In article <d24a5b2a.0407212312.66afaa9c@posting.google.com >,
b_srivastava@hotmail.com (Bikash) wrote:
[color=blue]
>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.[/color]

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".
Closed Thread