Se la mappa è globale, anche gli array devono esserlo, altrimenti spariscono quando vanno fuori scope e i puntatori diventano non più validi.
Per evitare situazioni del genere devi usare un vector (semplificando anche il functor) :
codice:
template <typename T>
struct MyArrayCompare {
	bool operator()(const T& a, const T& b) {
               // massimo indice confrontabile, se serve
                std::size_t maxComparingSize = std::min(a.size(),b.size());
                // implementazione del contronto tra array
                // ad esempio.
		return (a[0] < b[0]);
	}
};

map< vector<int>,string,MyArrayCompare <vector<int> > > mp;

int main() {

		int val1[3] = {0,1,2};
		int val2[3] = {1,2,3};

		vector<int> v1(&val1[0],&val1[3]);
		vector<int> v2(&val2[0],&val2[3]);

		mp.insert(make_pair(v1,string("1")));
		mp.insert(make_pair(v2,string("2")));
};
in alternativa, se il tuo compilatore supporta il nuovo std::tr1::array<>, puoi usare quello al posto del vector.
codice:
template <typename T>
struct MyArrayCompare {
	bool operator()(const T& a, const T& b) {
               // massimo indice confrontabile, se serve
                std::size_t maxComparingSize = std::min(a.size(),b.size());
                // implementazione del contronto tra array
                // ad esempio.
		return (a[0] < b[0]);
	}
};

map< std::tr1::array<int,3>,string,MyArrayCompare <std::tr1::array<int,3> > > mp;

int main() {

		std::tr1::array<int,3> val1 = {0,1,2};
		std::tr1::array<int,3> val2 = {1,2,3};

		mp.insert(make_pair(val1,string("1")));
		mp.insert(make_pair(val2,string("2")));
};