Mem, MyString

本文介绍了一个使用C++实现的自定义字符串类MyString的设计与实现过程,包括其内部使用的内存管理类MemB。同时,文章还讨论了如何通过这种方式避免strcpy和strcat等函数可能引发的安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MemB.h的代码:

#pragma once

#ifndef MEMB
#define MEMB

typedef unsigned char byte;

class MemB
{
private:
    byte * mem;
    int size;
    void ensureMinSize(int minSize);
public:
    MemB();
    MemB(int sz);
    int msize();
    byte * pointer();
    byte * pointer(int minSize);
    ~MemB(void);
};
#endif

 

MemB.cpp的代码:

#include "stdafx.h"
#include "MemB.h"
#include <cstring>
using namespace std;

MemB::MemB(int sz){
    mem=0;
    size=0;
    ensureMinSize(sz);
}


MemB::MemB()
{
    mem=0;
    size=0;
}

int MemB::msize(){
    return size;
}

void MemB::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 *MemB::pointer(){
    return mem;
}

byte *MemB::pointer(int minSize){
    ensureMinSize(minSize);        
    return mem;
}


MemB::~MemB(void)
{
    delete []mem;
}

 

MyString的代码和main函数:

#include "stdafx.h"
#include <iostream>
#include <cstring>
#include "MemB.h"
using namespace std;

class MyString{
    MemB *buf;
public:
    MyString();
    MyString(char * str);
    ~MyString();
    void concat(char * str);
    void print(ostream &os);
};

MyString::MyString(){
    buf = 0;
}

MyString::MyString(char * str){
    buf = new MemB(strlen(str)+1);
    strcpy((char *)buf->pointer(),str);
}

void MyString::concat(char * str){
    if(!buf)buf=new MemB;
    strcat((char*)buf->pointer(buf->msize()+strlen(str)+1),str);
}

void MyString::print(ostream & os){
    if(!buf)return;
    os<<buf->pointer()<<endl;
}

MyString::~MyString(){
    delete buf;
}

int _tmain(int argc, _TCHAR* argv[])
{
    MyString s("hello,Kate.");
    s.print(cout);
    s.concat("You will be good at it");
    s.print(cout);
    MyString s2;
    s2.concat("the second test");
    s2.print(cout);
    return 0;
}

 

strcpy遇到的不安全问题可以通过这个来解决:

http://jingyan.baidu.com/article/ce436649fd61543773afd32e.html

 

1. char *strcpy(char* dest, const char *src);

把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。

 

2.extern char *strcat(char *dest,char *src);

把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。

转载于:https://www.cnblogs.com/kateblog/p/5317512.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值