Проблема вот в этой строчке:
int get_num_from_BigInteger(BigInteger big_int){
Тут у вас идет передача по значению. У вас создается новая BigInteger переменная, со значением переданной. Поскольку вы конструктор копирования нигде не определили, компилятор сделал его вам сам, и там он тупо копирует все данные класса, включая указатель arr.
В итоге у вас получается два экземпляра класса, в каждом из которых указатель на один и тот же массив. Потом каждый из двух экземпляров в деструкторе вызовет free для одного и того же указатенля, вот и получается двойной free и креш.
Вам надо руководствоватся
правилом трех(пяти). Доопределите конструктор копирования. Вообще, вам бы стоило его запретить (
= delete;
), ибо копировать такие большие числа - это плохо. А в функции ваши передавайте BigInteger по константной ссылке.
Ну и в других функциях та же самая поблема.
И еще, в C++ не стоит использовать malloc/free, используйте new/delete. А еще лучше, используйте std::vector.