Ваше удаление [] t_ptr будет правильным только в том случае, если вы разместили t_ptr в куче, аля:
some_struct* t_ptr = new tpr[1000];
Затем оператор delete [] освобождает память для этих 1000 указателей, но ничего не делает с памятью, на которую могут ссылаться сами указатели. Чтобы освободить это, вам нужно сначала зациклить элементы t_ptr, удалив их один за другим:
for (i = 0; i < 1000; ++i)
delete t_ptr[i];
delete[] t_ptr;
Вы должны убедиться, что указатели изначально установлены в NULL, хотя удаление указателя NULL не является операцией, поэтому вам не нужно проверять цикл выше.
Это боль, не так ли? Вот почему очень хорошее руководство для новых программистов на C ++ - использовать векторы и умные указатели (например, из boost). Эти типы освобождаются, когда выходят из области видимости или выходят из программы ... вам даже не нужно об этом думать.