При передаче объекта по значению происходит его копирование, но динамически выделенная память не копируется, а только значение указателя _coords. В результате у вас два объекта которые ссылаются на один и тот же массив. По завершению работы Dist копия объекта уничтожается с вызовом деструктора и освобождением памяти. А по завершению работы программы вызываются деструкторы объектов A и B в которых происходит попытка освободить память для _coords второй раз, а это неопределенное поведения (undefined behaviour) другими словами может произойти вообще что угодно.
Вам нужно самому реализовать конструктор копирования или запретить его. Когда вы просто удаляете деструктор происходит утечка памяти, когда передаете по ссылке объекты не копируются поэтому всё норм. Если объект динамически выделяет память, например с помощью new или delete, то реализация конструктора копирования обязательна. Можно также его запретить перенеся конструктор копирования в приватную секцию или для c++11 объявить Point(const Point&) = delete; В этом случае передача такого объекта по значению приведет к ошибке компиляции. Это важная тема изучите ее.
Все что выделено с помощью new [] удаляется только с помощью delete[]