当函数返回指向类的指针时,是否调用了复制构造函数?

时间:2011-11-20 06:58:09

标签: c++ pointers copy-constructor

这个问题可能很愚蠢,但我想知道,如果在函数返回指向对象的指针时调用了复制构造函数? 另外,请考虑以下事项:

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

A* GetPoineter()
{

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

也是如此

A* a = a1.GetPointer(); 

调用复制构造函数?

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

  

A* a = a1.GetPointer();调用复制构造函数也是如此?

没有。
在您的情况下,您不返回对象而只返回对象的地址,因此它不会导致复制构造函数调用 如果您返回对象,它取决于编译器 现代编译器非常智能,可以通过使用返回值优化(RVO)命名返回值优化(NRVO)来阻止对复制构造函数的额外调用。

  

此外,我delete a,它还会删除a1指向的地址吗?

不,不会 如果您只是delete a,那么您的代码将导致内存泄漏,因为您仍然没有释放分配给a1的内存。两者都已分别显式分配动态内存,因此必须分别解除分配。