使用内存块

#include <string.h>
#include <assert.h>

class counted{
 class memblock{
  enum { size=100 };
  char c[size];
  int refcount;
 public:
  memblock(){
   memset(c,1,size);
   refcount=1;
  }
  memblock(const memblock & rv){
   memcpy(c,rv.c,size);
   refcount=1;
  }
  
  void attach(){++refcount;}
  void detach(){
   assert(refcount!=0);
   //destroy object if no one use it
   if(--refcount==0) delete this;
  }
  int count() const{ return refcount;}
  void set(char x){
   memset(c,x,size);
  }
  //conditionally copy this memory block
  //call bifore modifying the block
  //assign resulting poiter to your block
  memblock * unalias(){
   //don't duplicate if not aliased
   if(refcount==1) return this;
   --refcount;
   //use copy-constructor to duplicate
   return new memblock(*this);
  }
 }*block;
 public:
 counted(){
  block=new memblock; //sneak preview
 }
 counted(const counted & rv){
  block=rv.block; //pointer assignment
  block->attach();
 }
 
 void unalias(){
  block=block->unalias();
 }
 counted & operator=(const counted & rv){
  //check for self-assignment
  if(&rv==this) return *this;
  //clean up what you're using first
  block->detach();
  block=rv.block;
  block->attach();
  return *this;
 }
 //decrement refcount,conditionally destroy
 ~counted(){block->detach();}
 //copy on write
 void write(char value){
  //do this before any write operation
  unalias();
  block->set(value);
 }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值