避免内存泄漏
class SimplyClass{
private:
char *m_buf;
size_t m_nSize;
int m_count;
public:
SimplyClass(size_t n=1):m_nSize(n),m_buf(new char[n]),m_count(1){printf("count id %d/n",m_count);};
~SimplyClass(){
(m_count)--;//为0才释放内存
printf("count is %d/n",m_count);
if(m_count==0)
{
printf("%d is deleted at %xd/n",m_nSize,m_buf);
delete [] m_buf;
m_buf=NULL;
}
}
char*GetBuffer()const{return m_buf;}
//拷贝函数的实现~~用了引用计数的办法~`解决多次释放同一内存地址空间的问题
SimplyClass(const SimplyClass&a){
m_nSize=a.m_nSize;
m_buf=a.m_buf;
m_count=a.m_count;
(m_count)++;
printf("count is %d/n",m_count);
}
SimplyClass& operator=(const SimplyClass&s){
if(m_buf==s.m_buf)
return *this;
(m_count)--;
if(m_count==0)
{
printf("%d is deleted at %xd/n",m_nSize,m_buf);
delete[] m_buf;
m_buf=NULL;
m_count=1;
}
m_buf=s.m_buf;
m_nSize=s.m_nSize;
m_count=s.m_count;
(m_count)++;
}
};
void foo(){
SimplyClass a(10);
SimplyClass b=a;
//这样就会造成a内存地址~~两次被释放而出错
//可用将拷贝函数写为private类型~~但编译时会报错
//最好是引用计数来解决~~但是如果再加上下面这一句~~又有问题
SimplyClass c(20);
c=a;//c本来又20个字节的内存~~~但是最后没释放~~解决办法~~重载'='运算符
char*pChar1=a.GetBuffer();
strcpy_s(pChar1,sizeof("Hello!"),"Hello!");
printf("%s,/n",pChar1);
}
void main(void){
foo();
return;
}