From the very first line of your function, I could easily deduce that you are averse to defensive programming.
*index = hash(key, n);
In the line above, you assume that index is a valid pointer; that's not a very good idea.
The other issue I see is where you access m_Table, using possibly an index that is out of range. I do not know how you have m_Table declared, thus I cannot tell if it is an array or a vector. If the latter, then you should check the index versus the size of the "table", or handle an exception if you opt to use the at() method.
As for the following statement, you are once again making assumptions without any error checking; I would suggest that you program a little more defensively rather than make wild assumptions.
if (*(m_freeList[m_Table[*index].ptr]) == item)
Above you are accessing two arrays, never once checking to ensure the indexes are proper, and then de-referencing a pointer, which may be NULL.
P.S. Why is index passed as a pointer to the function; pass it by reference. Passing pointers is seldom done in C++.
P.S. #2 Note how I have shown the code above... I have used CODE
tags; please do the same in the future when posting code, for it makes it easier to read, and it preserves the formatting of the code.