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);
    }




  • 相关阅读:
    Shell脚本中$0、$#、$@等的意义
    shell脚本中常见的一些特殊符号和作用详解
    shell脚本中的反引号,单引号,双引号与反斜杠
    Shell中反引号(`)与$()用法的区别
    自己在linux上编译、链接、动态库和静态库的学习笔记
    让ie6 7 8 9支持原生html5 websocket
    解决浏览器不兼容websocket
    WebSocket兼容到低版本浏览器
    UART和RS232/RS485的关系,RS232与RS485编程
    TTL和RS232之间的详细对比
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7203842.html
Copyright © 2011-2022 走看看