Трудно увидеть какую-либо ошибку, может быть что-то не так с вашей индексацией, которая вызывает переполнение буфера в функции split, которая обнаруживается только при попытке удалить массив char **.
Как насчет преобразования в векторы std :: string и std ::, которые рекомендует carlpett (это хорошая рекомендация).
как то так:
void split(const std::string& str_, char delimiter_, std::vector<std::string>& result_)
{
std::string token;
std::stringstream stream(str_);
while( std::getline(stream, token, delimiter_) ) result_.push_back(token);
}
Затем вы просто вызываете его со своей строкой, разделителем и пустым std :: vector и в итоге получаете заполненный вектор подстрок. Вам не нужно использовать new / delete и беспокоиться о проблемах с памятью.