Content restrictions for the SPUPad
Because SPUPads are areas of system memory that you can write to, read from, and from which you can run programs or engines, use extreme caution with the data that you write to the SPUPad.
The SPUPad cannot be used to store some types of code objects. Attempting to store these objects can cause the S-Blade to reset. Therefore, while C++ objects can be stored in the SPUPad, some methods and C++ virtual function tables on those objects do not work.
C++ objects of type class, struct, or union can be divided into two groups: aggregates and non-aggregates. An aggregate is a class, struct, or union with no constructors, no private or protected members, no base classes, and no virtual functions. All other classes are non-aggregates. Aggregates can have static member functions and static class members.
Aggregate classes can be stored in the SPUPad. Although it is not supported, you can store a non-aggregate class if there is no base class and no virtual methods.
This has particular implications for destructors on objects. Non-virtual destructors on the objects are useful only if you manually invoke PAD_DELETE on an object and want the object to invoke PAD_DELETE on its children. (No heap memory that is used by the object or its children can be allocated by using anything other than PAD_NEW.)
When the object is destroyed automatically after the transaction, the destructor is not invoked, but the child objects are freed automatically to avoid a memory leak.