Connecting Tech Pros Worldwide Forums | Help | Site Map

Exception Handling & Memory Leak

Bikash
Guest
 
Posts: n/a
#1: Jul 22 '05
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
Guest
 
Posts: n/a
#2: Jul 22 '05

re: Exception Handling & Memory Leak


finnaly()
{
}

or use deconstructor .


John Harrison
Guest
 
Posts: n/a
#3: Jul 22 '05

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


Peter van Merkerk
Guest
 
Posts: n/a
#4: Jul 22 '05

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
Peter van Merkerk
Guest
 
Posts: n/a
#5: Jul 22 '05

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
Daniel T.
Guest
 
Posts: n/a
#6: Jul 22 '05

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