destructor is called.
Here is my code and output, let me know if you have any comments. Thanks. :-)
George wrote:
Thanks Ben,
1.
With /EHa, SEH and C++ exceptions may be mixed, but not in the same
I agree and this is what we proved in his thread before.
2.
function.  Separate the __try block body into a separate function.
What do you mean separate the __try block into another function? We
George, why do you always misquote people?  I did not say "separate the 
__try block into another function", but "Separate the __try block body into 
a separate function."
For example, this can't work:
void f(void)
{
    __try {
        this_could_fail();
        auto_ptr<T> temp = new T();
        temp->something_likely_to_fail();
    }
    __finally {
    }
}
The problem is the mixing of C++ destructors with SEH, because both need 
unwinding.  Whether the destructor for temp should be called depends on 
whether the constructor completed.  So we make the body of the __try block a 
separate function:
void fhelper(void)
{
        this_could_fail();
        auto_ptr<T> temp = new T();
        temp->something_likely_to_fail();
}
void f2(void)
{
    __try {
        fhelper();
    }
    __finally {
    }
}
Now the local inside fhelper can be properly unwound when a structured 
exception is thrown, because they exist in a unique stack frame that the 
compiler support for SEH knows how to deal with.
always provide try/catch or __try/__except into the same function. I
am confused. Could ytou provide some pseudo code to show your points
please?
regards,
Geprge
"Ben Voigt [C++ MVP]" wrote:
Igor Tandetnik wrote:
"George" <George@discussions.microsoft.com> wrote in message
news:625FF32F-F1B8-4989-B476-8272396CA81A@microsoft.com
I compile with /EHa, and not /EHsc, and this is why I have
confusion there is such error.
Double-check your project settings (perhaps you have a file-level
override). The documentation claims C2712 error should not be
produced under /EHa.
With /EHa, SEH and C++ exceptions may be mixed, but not in the same
function.  Separate the __try block body into a separate function.