That depends on what that data is supposed to be. What's taking up space is most likely what they're pointing to, not the pointers themselves. So you need to elaborate.
"is there a better way store this in the most compact way possible."
I can think of 1 solution that requires a single char*. It's simple. Let's say I wanted 4 10 byte blocks of memory. At the end each block would be a null-character, which marks the end of the proceeding block:
That above is simple. In Memory's constructor, a block of 40 bytes is allocated (the std::nothrow is rather self-explanatory. Instead of throwing an exception, new will return null). In the body of the constructor, the 9th character of each block is set to the null-character.
Whenever you want to extract the data, simply pull out all of the chars until you encounter the null character.
@Framework
Very nice. Is the increase in processing worth the compacting? Honest question; it may be a moot point.
Also, depending on the use of your struct, i've run into problems where the data was padded with bytes by the system and with Framework's solution, you can make sure everything is aligned as you intend.
"Is the increase in processing worth the compacting?"
In my opinion, it depends on the program's needs. You can extract each block then use them, treat each block as an array, or provide a simple interface for the block itself. Though, there may be an algorithm to enhance processing.
I should say that my solution allows the use of placement new, which I recommend.