Вызывается ли конструктор копирования, когда указатель на класс возвращается функцией? - PullRequest
1 голос
/ 20 ноября 2011

Этот вопрос может быть глупым, но я хочу знать, вызывается ли конструктор копирования, когда указатель на объект возвращается функцией? Также учтите следующее:

A* a1 = new A(); 
A* a = a1.GetPointer();

A* GetPoineter()
{

.....
return new A();
}

так же

A* a = a1.GetPointer(); 

конструктор копирования вызовов?

также, если я удалю a, удалит ли он также адрес, указанный a1?

Ответы [ 2 ]

5 голосов
/ 20 ноября 2011

Нет, он не вызывает конструктор копирования, поскольку вы возвращаете адрес объекта, а не сам объект.

delete a; удалит только объект, выделенный в функции GetPoineter. a1 не тронут, поскольку он указывает на совершенно другой объект.

2 голосов
/ 20 ноября 2011

так что A* a = a1.GetPointer(); вызывает конструктор копирования?

Нет.
В вашем случае вы не возвращаете объект, а просто адрес объекта, поэтому это не приводит к вызову конструктора копирования.
В случае, когда вы возвращаете объекты,Это зависит от компилятора.
Современные дневные компиляторы достаточно умны, чтобы предотвратить дополнительный вызов конструктора копирования, используя Оптимизация возвращаемого значения (RVO) и Оптимизация именованного возвращаемого значения (NRVO) .

Также я delete a, удалит ли он также адрес, указанный a1?

Нет, не будет.
Если вы просто delete a, то ваш код приведет к утечке памяти, поскольку вы все еще не освободили память, выделенную для a1.Оба были явно выделены динамической памяти отдельно, поэтому оба должны быть освобождены отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...