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

C++ 当函数返回指向类的指针时,是否调用复制构造函数?,c++,pointers,copy-constructor,C++,Pointers,Copy Constructor,这个问题可能很傻,但我想知道,当函数返回指向对象的指针时,是否调用了复制构造函数? 另外,考虑如下: A* a1 = new A(); A* a = a1.GetPointer(); A* GetPoineter() { ..... return new A(); } 我也是 A* a = a1.GetPointer(); 调用复制构造函数 此外,如果我删除a,它是否也会删除a1所指的地址 A*A=a1.GetPointer也是如此;调用复制构造函数 没有。 在您的例子中,您并没有返

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

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

A* GetPoineter()
{

.....
return new A();
}
我也是

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

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

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

没有。 在您的例子中,您并没有返回一个对象,只是返回一个对象的地址,所以它不会导致复制构造函数调用。 在返回对象时,它取决于编译器。 现代的编译器足够聪明,可以通过使用返回值OptimizationRVO和命名的返回值OptimizationNRVO来防止对复制构造函数的额外调用

我也删除了a,它会不会也删除a1所指的地址

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

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

没有。 在您的例子中,您并没有返回一个对象,只是返回一个对象的地址,所以它不会导致复制构造函数调用。 在返回对象时,它取决于编译器。 现代的编译器足够聪明,可以通过使用返回值OptimizationRVO和命名的返回值OptimizationNRVO来防止对复制构造函数的额外调用

我也删除了a,它会不会也删除a1所指的地址

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

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


删除一条;将仅删除在GetPoineter函数中分配的对象。a1未被触及,因为它指向一个完全不同的对象。

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



删除一条;将仅删除在GetPoineter函数中分配的对象。a1未被触及,因为它指向一个完全不同的对象。

假设此函数只返回位于其他地方的PointerLocation,那么会发生什么?A*GetPoineter{….返回A;假设此函数只返回位于其他地方的PointerLocation,那么会发生什么?A*GetPoineter{….返回一个;纯语义,没有什么真正重要的:GetPointer意味着从某个池返回一个指向现有对象的指针。GetNewObject表示它正在返回一个新分配的对象。如果GetPointer只是从某个池返回指针,会怎么样?现在如果我删除一个,它会不会导致某个地方出现一个悬空指针?Corr通常,创建对象的池管理器应该是删除对象的池管理器。除非您使用智能指针std::unique\u ptr。因此,如果池管理器正在删除对象,那么我不需要执行delete a,是吗?再次导致悬空指针…?纯语义,没有什么真正重要的:GetPointer意味着返回一个p指向某个池中的现有对象的指针。GetNewObject表示它正在返回一个新分配的对象。如果GetPointer只是从某个池中返回指针,会发生什么情况?现在如果我删除了,它不会导致某个地方出现悬空指针吗?正确。通常,创建对象的池管理器应该是删除它的人。Unle例如,您正在使用智能指针std::unique_ptr。因此,如果池管理器正在删除对象,那么我不需要执行删除操作,是吗?再次导致悬空指针…?假设此函数只返回位于其他位置的指针,那么会发生什么情况?a*GetPoineter{..return A;@Yogi:如果返回指针,则没有对象的副本,指针的副本不调用复制构造函数。如果返回地址为u的对象的内存在堆栈上,则会导致未定义的行为,因为一旦函数返回,对象将被销毁,而返回的指针指向inv考虑这个A* GooPositer {A2=新A;返回A2;}现在,如果我删除A,它会导致A2抖动吗?@瑜珈:现在没有A2不是动态的。你可以动态地分配它,并将指针返回到那个内存。一旦删除A,它就会删除分配给A2的内存,因为A2和A2指向内存位置。考虑这个A* GooPositter {A2=新A;返回A2;}。现在,如果我删除了a,它会导致a2悬空吗?a2是类的成员吗?或者如果a2是GetPointer本地的,它会导致未定义的行为吗?假设这个函数只是返回位于其他地方的PointerLocation,那么会发生什么呢?a*GetPoineter{…..r
等等A@Yogi:如果返回指针,则没有对象的副本,指针的副本不调用复制构造函数。如果返回地址的对象的内存在堆栈上,则会导致未定义的行为,因为一旦函数返回,对象就被销毁,指针返回到一些无效的东西。考虑这个** GooPositer {A2=新A;返回A2;}现在如果我删除A,它会导致A2悬空吗?@瑜伽:现在没有A2不是悬空。动态分配它并返回指向该内存的指针。一旦删除A,它将删除分配给A2的内存,因为A2和A2将指向内存位置。考虑这个A* GooPositter {A2= NeX.A;返回A2;}现在,如果我删除A,它会导致A2 dangLanga2是类成员吗?还是AcdiueActudio A2是GetPointer本地的?