#ifndef HASPTR_H
#define HASPTR_H
#include
class HasPtr
{
public:
HasPtr(const std::string &s =std::string()):
ps(new std::string(s)),i(0),use(new std::size_t(1)){};
HasPtr(const HasPtr& p):
ps(p.ps),i(p.i),use(p.use){++*use;}
HasPtr& operator=(const HasPtr&);
~HasPtr();
private:
std::string *ps;
int i ;
std::size_t *use;
};
#endif // HASPTR_H
#include “hasptr.h”
HasPtr::~HasPtr()
{
if(–*use==0)
{
delete ps;
delete use;
}
}
HasPtr& HasPtr::operator=(const HasPtr &s)
{
++*s.use;
/// if the left one of = is a new HasPtr object,
/// the 'use' of it is 1,so delete its own memory
/// and add the right items to it;
///
/// when it is resign itself again,the memory will
/// not be destoryed;
if(--*use ==0)
{
delete ps;
delete use;
}
ps = s.ps;
i = s.i;
use = s.use;
return *this;
}