Search code examples
scopec++buildertry-catch-finally

__finally in C++ Builder 2010 losing scope?


Here is a very strange thing which I don't think should happen:

UnicodeString test = "abc";

try
    {
    try
        {
        int a = 123;
        return a;   // This seems to produce a problem with "test" variable scope
        }
    catch (Exception &e)
        {
        // Some exception handler here
        }
    }
__finally
    {
    // At this point the "test" variable should still be in scope???
    test = "xyz"; // PROBLEM here - test is NULL instead of "abc"! Why?
    }

If I remove the return a; in the try-catch block the test variable is still defined. Is there a particular reason why after the above construct the UnicodeString seems to go out of scope? Is it a bug with C++ Builder 2010? I understand that return returns from function but it should still retain variable scope in the __finally block shouldn't it?


Solution

  • I did a bit more analysis and it seams that once you execute return statement all local objects from stack are acting as destroyed. If you try using heap objects instead this won't happen.

    UnicodeString *test = new UnicodeString("abc");
    
    try
        {
        try
            {
             int a = 123;
            return a;   // This seems to produce a problem with "test" variable scope
            }
        catch (Exception &e)
            {
            // Some exception handler here
            }
        }
    __finally
        {
        ShowMessage(*test); // "abc" 
        *test = "xyz"; 
        }
    delete test;
    

    Using smart pointers like unique_ptr will again result in loosing an object in __finally since return will initiate it's destruction.