Pour se protéger contre les dépassements de tableau on utilise la classe template suivante
template <class T> class A{
public: T *cc;
long size;
void init(long ssize);
T& operator [] (long i) const
{
assert ( cc&&(i >= 0) && (i < size) );
return cc[i];
}
A(long csize = 0)
{
size = csize;
if (size > 0 ) cc = new T[size];
else cc = 0;
}
A(const A& a);
A& operator=(const A& a);
~A() { delete [] cc;size = 0; }
void destroy() { delete [] cc;size = 0; cc=0; }
int no( T* t) const { return t - cc;} // return place in array
};
//-----------------------------------------------------
template <class T> void A<T>::init(long ssize)
{
assert( !cc && ssize );
size=ssize;
cc= new T[size];
assert(cc != 0);
}
//-----------------------------------------------------
template <class T> A<T>::A(const A<T>& a)
{
if( a.cc && a.size )
{ size = a.size; cc = new T[size];
for(int i=0; i<size;i++) cc[i] = a.cc[i];
}
}
//-----------------------------------------------------
template <class T> A<T>& A<T>::operator=(const A<T>& a)
{
assert( cc && a.cc && (a.size==size) );
for(int i=0; i<size;i++) cc[i] = a.cc[i];
return *this;
}
Toute création de tableau doit passer maintenant par les classes A<type>.