<p dir="ltr"><br>
On 4 Oct 2013 02:49, "emmanuel.attia" <<a href="mailto:emmanuel.attia@philips.com">emmanuel.attia@philips.com</a>> wrote:<br>
><br>
> > This has undefined behavior. You're calling a virtual function on an object<br>
> whose lifetime has ended (the destructor has already been called).<br>
><br>
> my_destroy_interface has no destructor so the vtable is not cleared until<br>
> the memory is released (since nothing alters it before i get in the operator<br>
> delete overload).<br>
><br>
> Referring to the standards (i'm not sure its the right pdf):<br>
> "The lifetime of an object of type T ends when:<br>
> — if T is a class type with a non-trivial destructor (12.4), the destructor<br>
> call starts, or<br>
> — the storage which the object occupies is reused or released."<br>
> <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf</a><br>
><br>
> And that make totally sense since if i add a  (non-virtual) destructor it<br>
> still flies, unless the destructor is non trivial (in that case i get as<br>
> expected a pure virtual function call).</p>
<p dir="ltr">This is sort of beside the point, since you had undefined behaviour earlier:</p>
<p dir="ltr">> > This has undefined behavior (you're using 'delete', the static and dynamic<br>
> > types don't match, and your base class does not have a virtual<br>
> > destructor).<br>
><br>
> That's the point, i call the overload "my_destroy_interface::operator<br>
> delete" and not the global delete operator. Since my_destroy_interface has<br>
> no (non trivial) destructor this is the only thing happening when calling<br>
> delete on a pointer to my_destroy_interface.</p>
<p dir="ltr">You can't reason like that about undefined behaviour. You deleted an object thorough the wrong static type and the dtor is not virtual, so you've already lost.</p>
<p dir="ltr">> > Nope. See above. Or try giving my_destroy_interface a user-declared<br>
> > (non-virtual) destructor, and watch as it either gets called twice or your<br>
> > program starts to die due to a pure virtual function call (depending on<br>
> > implementation details).<br>
><br>
> Giving to my_destructor_interface a virtual destructor would make it called<br>
> twice as you said, thats why it's not there in this construct (and it makes<br>
> sense since its an interface).<br>
><br>
><br>
><br>
><br>
> --<br>
> View this message in context: <a href="http://clang-developers.42468.n3.nabble.com/is-delete-on-abstract-with-non-virtal-ever-safe-tp4025653p4034880.html">http://clang-developers.42468.n3.nabble.com/is-delete-on-abstract-with-non-virtal-ever-safe-tp4025653p4034880.html</a><br>

> Sent from the Clang Developers mailing list archive at Nabble.com.<br>
><br>
> _______________________________________________<br>
> cfe-dev mailing list<br>
> <a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</p>