[aspectc-user] AspectC++ and singletons?
Mike Mortensen
mmo at fc.hp.com
Fri Nov 23 19:13:23 CET 2007
Until experimenting with implementing singleton without the regular code
switching to
a static call, I hadn't thought about the heap versus local use of
constructors in C++.
Also, related to that is the fact that not only do the automatic
instantiations normally get
freed when exiting the scope they were created in, but also that if the
user (in the 'normal'
non-aspect code) ever called 'delete object;' after creating it (on our
aspectualized singleton
object), it would mess things up (since all other objects allocated were
now -- thanks to an
aspect -- pointing to the one singleton).
Thus, in addition to handling object creation in the heap versus local
stack (automatic), an
aspect would have to prevent the destructor from removing the memory.
However, AspectC++
provides the same kind of 'execution' access to the destructor, which
doesn't prevent the
actual freeing of the memory.
This is not a criticism of AspectC++ -- rather, I think the correct (or
perhaps preferred) way
would be for the client to use a static 'factory' creation function:
ShapeRegistry *sr1 = ShapeRegistry::createShapeRegistry();
and then allow the aspect to augment that to either be or regular
factory or singleton...
Thanks for everyone's feedback!
-Mike
> Olaf Spinczyk schrieb:
>
>> Hi Mike,
>>
>> at the moment AspectC++ does not support the interception of
>> constructor calls on the client side. The 'construction' advice is
>> something like 'execution' advice for the constructor. When the
>> constructor is executed, the memory for the object has already been
>> allocated. Therefore, this language feature doesn't help you.
>
>
> Just an idea: Memory allocation on the heap could be influenced by
> introducing a class-level operator new into the class that always
> returns the address of the one-and-only singleton. However, after an
> allocation the constructor is executed anyway. This means that we had
> a situation where an object is constructed multiple times at the same
> memory location. It might be possible to catch this situation in the
> constructor body, the the constructors of base classes and class-type
> member variables have already been executed by this time.
>
> Another thing is that all this does not help for static or automatic
> instantiations of the class, as operator new is not involved in these
> cases.
>
> Daniel
>
More information about the aspectc-user
mailing list