Я думаю, что вам нужно будет создать стековый объект, который получает указатель на массив указателей и выполняет очистку в его деструкторе. Что-то вроде:
template <typename T>
struct ArrayDeleter
{
ArrayDeleter(T** array, size_t size)
: m_array(array), m_size(size)
{}
~ArrayDeleter()
{
for (size_t i = 0; i != m_size; ++i)
{
delete m_array[i];
}
delete [] m_array;
}
T** m_array;
size_t m_size;
};
Нет умного указателя, который бы делал это, поэтому вам просто нужно сделать это самостоятельно.