这个问题可能很愚蠢,但我想知道,如果在函数返回指向对象的指针时调用了复制构造函数? 另外,请考虑以下事项:
A* a1 = new A();
A* a = a1.GetPointer();
A* GetPoineter()
{
.....
return new A();
}
也是如此
A* a = a1.GetPointer();
调用复制构造函数?
如果我删除a
,它是否也会删除a1
指向的地址?
答案 0 :(得分:5)
不,它不会调用复制构造函数,因为您返回的是对象的地址,而不是对象本身。
delete a;
只会删除GetPoineter
函数中分配的对象。 a1
未被触及,因为它指向一个完全不同的对象。
答案 1 :(得分:2)
A* a = a1.GetPointer();
调用复制构造函数也是如此?
没有。
在您的情况下,您不返回对象而只返回对象的地址,因此它不会导致复制构造函数调用
如果您返回对象,它取决于编译器
现代编译器非常智能,可以通过使用返回值优化(RVO)和命名返回值优化(NRVO)来阻止对复制构造函数的额外调用。
不,不会 如果您只是此外,我
delete a
,它还会删除a1
指向的地址吗?
delete
a
,那么您的代码将导致内存泄漏,因为您仍然没有释放分配给a1
的内存。两者都已分别显式分配动态内存,因此必须分别解除分配。