take a look:
template <class T>
class tBuff
{
public:
tBuff(const T* a=0,const unsigned int n=0){ _buff=0; _size=0; put(a,n); }
~tBuff(){ if(_buff) free(_buff); }
tBuff& operator = (tBuff& other){ put(other._buff,other._buff?other._size:0); return *this; }
protected:
void put(const T* buff,const unsigned int size)
{
#ifdef SELF_ASSIGN_TEST
if(_buff!=buff)
{
_size = size;
if(0<_size)
{
_buff = (T*)(_buff?realloc(_buff,sizeof(T)*size):malloc(sizeof(T)*size));
memcpy(_buff,buff,sizeof(T)*size);
}
}
#else // #ifndef SELF_ASSIGN_TEST
_size = size;
if(0<_size)
{
_buff = (T*)(_buff?realloc(_buff,sizeof(T)*size):malloc(sizeof(T)*size));
memcpy(_buff,buff,sizeof(T)*size);
}
#endif // SELF_ASSIGN_TEST
}
protected:
T* _buff;
unsigned int _size;
};
#undef SELF_ASSIGN_TEST
{
static int __testval[] = { 1,2,3,4,5 };
tBuff<int> buff(__testval,sizeof(__testval)/sizeof(__testval[0]));
buff = buff;
}
#define SELF_ASSIGN_TEST
{
static int __testval[] = { 1,2,3,4,5 };
tBuff<int> buff(__testval,sizeof(__testval)/sizeof(__testval[0]));
buff = buff;
}