【问题标题】:Is copy constructor called when a pointer to a class is returned by function?当函数返回指向类的指针时是否调用复制构造函数?
【发布时间】:2012-01-02 06:05:36
【问题描述】:

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

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

A* GetPoineter()
{

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

也是这样

A* a = a1.GetPointer(); 

调用复制构造函数?

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

【问题讨论】:

  • 纯语义,没什么大不了的:GetPointer() 意味着从某个池返回一个指向现有对象的指针。 GetNewObject() 表示它正在返回一个新分配的对象。
  • 如果 GetPointer() 只是从某个池中返回指针会发生什么,现在如果我删除一个,它不会导致某个地方的悬空指针吗?
  • 正确。通常,创建对象的人(池管理员)应该是删除它的人。除非您使用智能指针(例如 std::unique_ptr)。
  • so 如果池管理器正在删除对象,那么我不需要执行 delete a,是吗?(再次导致悬空指针...)?

标签: c++ pointers copy-constructor


【解决方案1】:

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

没有。
在您的情况下,您不是返回对象,而是返回对象的地址,因此不会导致复制构造函数调用。
如果您返回对象,则取决于编译器。
现代编译器足够聪明,可以通过使用 Return Value Optimization(RVO)Named Return Value Optimization(NRVO) 来防止对复制构造函数的额外调用。

另外我delete a,也会删除a1指向的地址吗?

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

【讨论】:

  • 假设这个函数只是返回指针(分配在别处),那么会发生什么? A* GetPoineter() { ..... return A;
  • @Yogi:如果你返回指针没有对象的副本,有指针的副本,它不会调用复制构造函数。如果你返回的对象的内存在堆栈上,那么它会导致未定义的行为,因为一旦函数返回并且您返回的指针指向无效的东西,对象就会被破坏。
  • 考虑这个 A* GetPoineter() { a2 = new A;返回a2; } 现在如果我删除 a,会导致 a2 悬空吗?
  • @Yogi:不,a2 现在没有悬空。您动态分配它并返回指向该内存的指针。一旦你delete a,它将删除分配给a2 的内存,因为aa2 将指向内存位置。
  • 考虑这个 A* GetPoineter() { a2 = new A;返回a2;现在如果我删除 a,它会导致 a2 悬空(a2 是类成员)吗?或未定义的行为(如果 a2 是 GetPointer 的本地?)
【解决方案2】:

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

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

【讨论】:

  • 假设这个函数只是返回指针(分配在别处),那么会发生什么? A* GetPoineter() { ..... return A;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多