В главном потоке создается динамический массив. Затем создается отсоединенный поток, который использует этот динамический массив.
int *arr[N];
...
thread thr(Daughter);
thr.detach();
...
delete[] arr;
Дочерний поток периодически проверяет флаг, который может установить основной поток. Когда флаг установлен, дочерний поток завершает работу.
Если главный поток решит завершить свою работу и работу дочернего потока, установит флаг завершения дочернего поток и тут же начнет освобождать память, то может произойти ошибка, так как дочерний поток не сразу останавливается и может обратиться к освобожденной памяти.
Как и когда освобождать память?
Надо заметить, что дочерний поток сам не может освобождать память, поскольку она может может быть востребована в главном потоке и после завершения дочернего.