耗费了2个小时重写了一遍CString 若有漏洞 欢迎指出~ 谢谢
首先贴出代码部分:
////////////////////////////////////////////////////////////////
////////////////////////XNString.h////////////////////////////
////////////////////////////////////////////////////////////////
#pragma once
typedef int BOOL;
class CXNStringA
{
public:
CXNStringA(void);
bool Create(char*);
bool CutLeft(int);
bool CutRight(int);
//not include the null at the last pace of the string
int GetLength();
int GetBytes();
void Release();
char* GetCStr();
void AddAtEnd(char*);
CXNStringA operator=(char* str );
CXNStringA operator+=(char* str);
CXNStringA operator=(CXNStringA& str);
CXNStringA operator+=(CXNStringA& str);
operator char* ();
~CXNStringA(void);
private:
//c mode string
char* m_str;
char* m_strDup;
//include the null at the last pace of the string
int m_strlen;};
////////////////////////////////////////////////////////////////
////////////////////////XNString.cpp////////////////////////////
////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "XNString.h"CXNStringA::CXNStringA(void)
{
m_str = 0;
m_strlen = 0;
m_strDup = 0;
}CXNStringA::~CXNStringA(void)
{
this->Release();
}bool CXNStringA::Create(char* str)
{
/*
printf("Length of ‘%s‘ : %d\n", mbstr1, _mbstrlen(mbstr1) );
printf("Bytes in ‘%s‘ : %d\n", mbstr1, strlen(mbstr1) );
*/
if(0!=m_str)
delete[] m_str;
//strlen 返回的是字节数(不包括末尾NULL) _mbstrlen();
m_strlen = strlen(str) + 1;
m_str = new char[m_strlen];
return strcpy_s(m_str,m_strlen,str)?FALSE:TRUE;}
void CXNStringA::Release()
{if(m_str)
delete[] m_str;
m_str = 0;
m_strlen = 0;
if(m_strDup)
free(m_strDup);
m_strDup = 0;}
int CXNStringA::GetLength()
{
return m_strlen-1;
}bool CXNStringA::CutLeft(int numCut)
{
if(0==m_str)
return false;
int newLen= numCut+1;
char* oldStr=m_str;
m_str = new char[newLen];
m_strlen=newLen;
strcpy_s(m_str,newLen,oldStr);
m_str[numCut] = 0;
delete[] oldStr;
return true;
}bool CXNStringA::CutRight(int numCut)
{
if(0==m_str)
return false;
int newLen= numCut+1;
char* oldStr=m_str+sizeof(char)*(m_strlen-numCut-1);
m_str = new char[newLen];
m_strlen=newLen;strcpy_s(m_str,newLen,oldStr);
return true;
}CXNStringA CXNStringA::operator=( char* str )
{
//here here
CXNStringA string;
string.Release();
string.Create(str);
return string;
}CXNStringA CXNStringA::operator=( CXNStringA& str )
{
return str;
}char* CXNStringA::GetCStr()
{
if(!m_str)
return 0;
if(m_strDup)
free(m_strDup);
m_strDup = _strdup(m_str);
return m_strDup;
}int CXNStringA::GetBytes()
{
return m_strlen;
}CXNStringA::operator char *()
{
if(!m_str)
return 0;
if(m_strDup)
free(m_strDup);
m_strDup = _strdup(m_str);
return m_strDup;
}CXNStringA CXNStringA::operator+=( char* str )
{
if(str)
this->AddAtEnd(str);
return *this;
}CXNStringA CXNStringA::operator+=( CXNStringA& str )
{
if(str.m_str)
this->AddAtEnd(str.m_str);
return *this;
}void CXNStringA::AddAtEnd( char* str)
{
if(NULL==m_str)
return;
int len=strlen(str);
char* old = _strdup(m_str);
delete[] m_str;
m_strlen+=len;
m_str = new char[m_strlen];
strcpy_s(m_str,m_strlen,old);
strcat_s(m_str,m_strlen,str);
free(old);
}////////////////////////////////////////////////////////////////
////////////////////////stdafx.h////////////////////////////
////////////////////////////////////////////////////////////////
#pragma once
#include "targetver.h"
#include <string.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
////////////////////////////////总结////////////////////////////////
1.strlen()获得的是str的字节数(不包括末尾的NULL字节)
2._strcat()可以将一字符串连接到另一字符串末尾,但要注意需要重新分配内存。
3._strcup()创建一份字符串的拷贝,但是要注意事后free()解决问题
4.重载类型转换运算符的问题:
operator XXX ();
5.new 和 malloc()的区别在于:
1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5.new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void*指针。new delete在实现上其实调用了malloc,free函数
6.new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
7.new 建立的是一个对象;alloc分配的是一块内存.
6.delete 和 free()的区别在于:
1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间
2. delete [] 用于释放 new [] 分配的空间
3. delete 释放空间的时候会调用 相应对象的析构函数
顺便说一下new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存
4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL
5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放