MQL5 dll (MSVC8) 2dim array and double pointer

//+------------------------------------------------------------------+

//| Filling the array with values    (double pointer)     DP         |

//+------------------------------------------------------------------+

_DLLAPI void __stdcall fnFillArray2DP(int arr[][COL],const int arr_size)

  {

   int i,j;

//--- check input variables

   if(arr==NULL || arr_size<1) return;

//--- fill array with values

   int **ptr2;

   ptr2=new int*[arr_size];

   for ( i = 0 ; i < arr_size ; i++)

     ptr2[i]= new int[COL];

   for ( i = 0 ; i < arr_size ; i++)

        ptr2[i] = (int *)arr + i * COL;

   for( i=0;i<arr_size;i++)

     for( j=0;j<COL;j++)

       ptr2[i][j]=i;

   for ( i = 0 ; i < arr_size ; i++)

     delete[] ptr2[i];

   delete[] ptr2;

/*

   int i,j;

   int *aux[arr_size];

   int **ptr2;

   ptr2 = (int **)aux;

   for ( i = 0 ; i < arr_size ; i++)

        aux[i] = (int *)arr + i * COL;

   for( i=0;i<arr_size;i++)

     for( j=0;j<COL;j++)

       **ptr2=i;

*/

  }

////////////////////////////////////////////////////////////////////////////////////

#include <iostream>

#include <exception>

using namespace std;

template<class T>

bool create_matrix(T*** const ptr, const unsigned int &x, const unsigned int &y){

    try{

        *ptr = new T*[x];   

    }

    catch(bad_alloc){

        return false;

    }

    T* memory_pool;

    try{ 

        memory_pool = new T[x*y];

    }

    catch(bad_alloc){

        delete [](*ptr);

        return false;

    }

    for(int i=0;i<x;i++){

        (*ptr)[i] = memory_pool;    

        memory_pool+=y;

    }

    return true;

}

template<class T>

bool delete_matrix(T*** const ptr){

    delete [](*ptr)[0];

    delete [](*ptr);

    return true;

}

int main(){

    int** ptr;

    create_matrix<int>(&ptr, 10, 10);

    delete_matrix<int>(&ptr);

    return 0;

}