//Example 1 
#include "ace/Malloc.h"
//A chunk of size 1K is created
typedef char
MEMORY_BLOCK[1024];
 
 
//Create an ACE_Cached_Allocator which is passed
in the type of the
//chunk  that it must pre-allocate and assign
on the free
//list
typedef ACE_Cached_Allocator<MEMORY_BLOCK,ACE_SYNCH_MUTEX>
Allocator;
 
class MessageManager{
public:
//The constructor is passed the number of chunks
that the allocator should pre-allocate //and maintain on its free list.
MessageManager(int n_blocks):
 allocator_(n_blocks),message_count_(0){}
//Allocate memory for a message using the Allocator
void allocate_msg(const char *msg){
 mesg_array_[message_count_]=
    (char*)allocator_.malloc(ACE_OS::strlen(msg));
 ACE_OS::strcpy(mesg_array_[message_count_],msg);
 message_count_++;
 }
//Free all memory allocated. This will cause the
chunks to be returned
//to the allocators internal free list and NOT
to the OS.
void free_all_msg(){
 for(int i=0;i<message_count_;i++)
  allocator_.free(mesg_array_[i]);
 message_count_=0;
 }
void display_all_msg(){
 for(int i=0;i<message_count_;i++)
  ACE_OS::printf("%s\n",mesg_array_[i]);
 }
 
private:
 char *mesg_array_[20];
 Allocator allocator_;
 int message_count_;
};
 
int main(int argc, char* argv[]){
if(argc<2){
 ACE_OS::printf("Usage: egXX <Number of blocks>\n");
 exit(1);
 }
 
//Instatiate the Memory Manager class
int n_blocks=ACE_OS::atoi(argv[1]);
MessageManager mm(n_blocks);
 
//Use the Memory Manager class to assign messages
and free them. Run this in your
//debug environment and you will notice that
//the amount of memory your program uses
//after Memory Manager has been instantiated
remains the same. That means the
//Cached Allocator controls
or manages all the memory for the application.
//Do forever.
while(1){
  //allocate the messages somewhere
 for(int i=0; i<n_blocks;i++)
  mm.allocate_msg("Hi there");
 //show the messages
 mm.display_all_msg();
 
 for( i=0;i<n_blocks;i++)
  mm.free_all_msg();
 }
}