贝贝花花包包店,精品555皮具,钱夹,皮夹

字体: | 推荐给好友 上一篇 | 下一篇

ACE程序员教程-第3章 ACE的内存管理

发布: 2008-6-13 14:30 | 作者: Umar Syyid | 来源: 转载 | 查看: 253次

 

3-1

#include "ace/Malloc.h"

//A chunk of size 1K is created. In our case we decided to use a simple array

//as the type for the chunk. Instead of this we could use any struct or class

//that we think is appropriate.

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.

// Since the Cached_Allocator is a template class we can pretty much

//pass it ANY type we think is appropriate to be a memory block.

typedef ACE_Cached_Allocator 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)

{

mesg_array_=new char*[n_blocks];

}

 

//Allocate memory for a message using the Allocator. Remember the message

//in an array and then increase the message count of valid messages

//on the message array.

void allocate_msg(const char *msg)

{

mesg_array_[message_count_]=allocator_.malloc(ACE_OS::strlen(msg)+1);

ACE_OS::strcpy(mesg_array_[message_count_],msg);

message_count_++;

}

 

//Free all the memory that was allocated. This will cause the chunks

//to be returned to the allocator’s internal free list

//and NOT to the OS.

void free_all_msg()

{

for(int i=0;i

allocator_.free(mesg_array_[i]);

 

message_count_=0;

}

 

//Just show all the currently allocated messages in the message array.

void display_all_msg()

{

for(int i=0;i

ACE_OS::printf("%s\n",mesg_array_[i]);

}

 

private:

char **mesg_array_;

Allocator allocator_;

int message_count_;

};

 

int main(int argc, char* argv[])

{

if(argc<2)

{

ACE_DEBUG((LM_DEBUG, "Usage: %s \n", argv[0]));

exit(1);

}

 

int n_blocks=ACE_OS::atoi(argv[1]);

 

//Instantiate the Memory Manager class and pass in the number of blocks

//you want on the internal free list.

MessageManager mm(n_blocks);

 

//Use the Memory Manager class to assign messages and free them.

//Run this in your favorite 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

ACE_DEBUG((LM_DEBUG,"\n\n\nAllocating Messages\n"));

for(int i=0; i

ACE_OS::sprintf(message,"Message %d: Hi There",i);

mm.allocate_msg(message);

}

 

//show the messages

ACE_DEBUG((LM_DEBUG,"Displaying the messages\n"));

ACE_OS::sleep(2);

mm.display_all_msg();

 

//free up the memory for the messages.

ACE_DEBUG((LM_DEBUG,"Releasing Messages\n"));

ACE_OS::sleep(2);

mm.free_all_msg();

}

 

return 0;

}

 

这个简单的例子包含了一个消息管理器,它对缓存式分配器进行实例化。该分配器随即用于无休止地分配、显示和释放消息。但是,该应用的内存使用并没有变化。你可以通过你喜欢的调试工具来检查这一点。

42/4<1234>
 

评分:0

我来说两句

seccode