Ваше "Скопировано!" строка в выводе исходит от конструктора копирования, поэтому вы создаете три объекта, а не два (тогда вы уничтожаете все три, как и ожидалось).
Обратите внимание, что конструктор копирования должен обычно принимать свой аргумент по ссылке const
. Возможно, вы используете компилятор Microsoft C ++, который привязывает временную ссылку к неконстантной ссылке.
Также обратите внимание, что если вы включите оптимизацию, вы, вероятно, можете ожидать увидеть только два конструктора и два деструктора без создания копии. С достаточно новым (C ++ 17) компилятором это должно произойти, даже если вы не включаете оптимизацию (удаление из копии стало обязательным).
Если вы собираетесь извлекать много данных (т.е. достаточно данных, чтобы вызвать проблемы с памятью), то getBinaryStream предоставит вам максимальную гибкость для обработки и удаления данных по мере их чтения.
С другой стороны стороны, это может быть довольно медленным, в зависимости от вашего драйвера JDBC, поскольку каждое чтение из потока может повлечь за собой большое количество сетевых взаимодействий с базой данных. Если вы вызываете getBytes, то драйвер знает, что нужно получить всю партию за один раз, что, вероятно, будет более эффективным.
getBlob () возвращает «указатель» на данные, которыми вы можете управлять, используя методы интерфейса Blob. Если вам нужно изменить или иным образом поработать с данными на месте, это может быть лучше для вас.
Обычно вы хотите выбрать потоковые методы (т.е. getBlob (). GetBinaryStream () или getBinaryStream ()) а не метод байтового массива.
В худшем случае база данных (или драйвер JDBC) действительно не поддерживает потоковую передачу двоичных данных, но при этом все еще нет заметного штрафа за использование методы потоковой передачи.