zoukankan      html  css  js  c++  java
  • C++实现简单的内存块自己主动管理

    #ifndef __MEM__H
    #define __MEM__H
    
    #include<iostream>
    using namespace std;
    
    //自己主动管理内存块
    typedef unsigned char byte;
    
    class Mem
    {
    
    private:
    	byte* mem;
    	int size;
    	void ensureMinSize(int minSize);
    public:
    	Mem();
    	Mem(int sz);
    	~Mem();
    	int msize();
    	//byte* pointer();
    	byte* pointer(int minSize=0);
    };
    Mem::Mem()
    {
    	mem =0;
    	size =0;
    }
    Mem::Mem(int sz)
    {
    	mem =0;
    	size =0;
    	ensureMinSize(sz);
    }
    Mem::~Mem()
    {
    	delete []mem;
    }
    
    int Mem::msize()
    {//当前的内存大小
    	return size;
    }
    
    void Mem::ensureMinSize(int minSize)
    {//自己主动增长申请内存
    	if(size < minSize)
    	{
          byte* newmem = new byte[minSize];
    	  memset(newmem+size,0,minSize - size);
    	  memcpy(newmem,mem,size);
    	  delete []mem;
    	  mem = newmem;
    	  size = minSize;
    	}
    }
    
    //byte* Mem::pointer()
    //{//返回当前内存的首地址
    	//return mem;
    //}
    byte* Mem::pointer(int minSize)
    {//又一次增长内存并返回内存的起始地址
    	  ensureMinSize(minSize);
    	  return mem;
    }
    #endif
    #include "mem.h"
    class Mystring
    {
    public:
    	Mystring();
    	Mystring(char *str);
    	~Mystring();
    	void concat(char *str);
    	void print(ostream &os);
    private:
    	Mem *buf;
    };
    
    Mystring::Mystring()
    {
    	buf = 0;
    }
    
    Mystring::Mystring(char *str)
    {
    	buf = new Mem(strlen(str)+1);
    	strcpy((char*)buf->pointer(),str);
    }
    
    void Mystring::concat(char *str)
    {
    	if(!buf)
    		buf = new Mem;
    	strcat((char*)buf->pointer(buf->msize()+strlen(str)),str);
    }
    
    void Mystring::print(ostream &os)
    {
    	if(!buf)
    		return ;
    	os<<buf->pointer()<<endl;
    }
    
    Mystring::~Mystring()
    {
    	delete buf;
    }
    
    void main()
    {
      Mystring s("mytest");
      s.print(cout);
      s.concat(" is weikai");
      s.print(cout);
    }


    尽量不要把默认參数作为一个标志去决定运行函数哪一块,这是基本原则.在这样的情况下,仅仅要可以就应该把函数分解成两个或者多个重载的函数。以下这样的方式就是把默认參数作为决定运行

    Mystring::Mystring(char *str)
    {
      if(! *str)
    {
      buf =0;
    return;
    }
    
    buf = new Mem(strlen(str)+1);
    strcpy((char*)buf->point(),str);
    }




  • 相关阅读:
    学习ExtJs的几个资源(转)
    使用Qunit对JavaScript进行单元测试
    Google Analytics基础—追踪代码
    Javascript/jquery异步加载使用方法详解(转)
    Javascript中数组的sort方法的分析
    关于asp.net与winform导出excel的代码
    今天遇到的exeSql问题
    转载 highchat的参数 及其说明
    传智播客的qqtab代码
    几个sql小知识
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7203842.html
Copyright © 2011-2022 走看看