так что A* a = a1.GetPointer();
вызывает конструктор копирования?
Нет.
В вашем случае вы не возвращаете объект, а просто адрес объекта, поэтому это не приводит к вызову конструктора копирования.
В случае, когда вы возвращаете объекты,Это зависит от компилятора.
Современные дневные компиляторы достаточно умны, чтобы предотвратить дополнительный вызов конструктора копирования, используя Оптимизация возвращаемого значения (RVO) и Оптимизация именованного возвращаемого значения (NRVO) .
Также я delete a
, удалит ли он также адрес, указанный a1
?
Нет, не будет.
Если вы просто delete
a
, то ваш код приведет к утечке памяти, поскольку вы все еще не освободили память, выделенную для a1
.Оба были явно выделены динамической памяти отдельно, поэтому оба должны быть освобождены отдельно.