当函数返回指向类的指针时调用其复制构造函数

Is copy constructor called when a pointer to a class is returned by function?

本文关键字:调用 复制 构造函数 指针 返回 函数      更新时间:2023-10-16

这个问题可能很愚蠢,但是我想知道,当函数返回指向对象的指针时,是否调用了复制构造函数?此外,考虑:

A* a1 = new A(); 
A* a = a1.GetPointer();
A* GetPoineter()
{
.....
return new A();
}

A* a = a1.GetPointer(); 

调用复制构造函数?

如果我删除a,它是否也会删除a1所指向的地址?

不,它不调用复制构造函数,因为您返回的是对象的地址,而不是对象本身。

delete a;只会删除GetPoineter函数中分配的对象。a1不受影响,因为它指向一个完全不同的对象

那么A* a = a1.GetPointer();调用复制构造函数吗?


在你的情况下,你没有返回一个对象,而只是一个对象的地址,所以它不会导致复制构造函数调用。
当你返回对象时,它取决于编译器。
现代的编译器足够聪明,可以通过使用返回值优化(RVO)命名返回值优化(NRVO)来防止对复制构造函数的额外调用。

如果是delete a,它也会删除a1指向的地址吗?

不会的。
如果您只是delete a,那么您的代码将导致内存泄漏,因为您仍然没有释放分配给a1的内存。