Initializing pointer to vector of objects inside another object
This is wrong:


Device device;

void setup() 
{
   device = Device();
}



I don't know what your intentions are, but the first line instantiates device. You don't need to do anything in setup here. It sort-of looks like you are trying to call the constructor but that is called when the class instance is created (in the first line).




Preset* Presets[];



What's this? A pointer to an array of zero length?




    *Presets = (Preset*)malloc(sizeof(Preset) * NumPresets);



Now you are allocating memory for a pointer to the array to be big enough to hold the contents of the array.




for (int p = 0; p &lt; NumPresets; p++)
{
    Presets[p] = new Preset("test", NumPixels, NumPatterns);
}   



Now you are allocating memory for the contents of the array again.



There is too much dereferencing going on here. Please post a Minimal, Complete, and Verifiable example. For example, make the classes in question do not much. Then make code we can actually work on. 




  I realize the first call is to the default constructor, but in the setup i do the real construction ...


Well, you can't call the constructor twice. What is commonly done is to do nothing (or almost nothing) in the constructor, and then make a begin function which you call in setup. This function can then do whatever is required at the proper time.