1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <stdexcept>
template< class T >
T** Alloc2D(
size_t taille1, /*[in] Nb de lignes */
size_t taille2 /*[in] Nb de valeurs par ligne */
)
{
size_t const taille1x2 = taille1*taille2;
if(taille1x2 / taille2 != taille1)
throw std::overflow_error("Size multiplication overflow"); //Débordement des tailles
//Alloue tableau de pointeurs (première dimension)
T** ppValeurs = new T*[taille1];
try
{
//Alloue tableau des données
T* pValeurs = new T[taille1x2];
//Fait pointer les pointeurs aux différents endroits des données
for(size_t i=0 ; i<taille1 ; ++i)
ppValeurs[i] = pValeurs + (i*taille2);
}
catch(std::bad_alloc const &)
{
//La seconde allocation a échoué: On nettoie la première.
delete[] ppValeurs;
throw;
}
}
template< class T >
Free2D(T** ppValeurs)
{
if(ppValeurs != NULL)
{
delete[] ppValeurs[0]; //Supprime le tableau des données
delete[] ppValeurs; //Supprime le tableau de pointeurs
}
} |
Partager