从函数C ++返回指针或引用

时间:2010-08-20 20:11:43

标签: c++ pointers reference

如果要从方法返回实例,是否要创建对象并向后发送指针或引用?什么是正确的方法和方法签名?

6 个答案:

答案 0 :(得分:8)

在C ++中有很多方法可以做到这一点。不幸的是,大多数都会导致混淆谁负责分配和解除分配对象。我推荐两种方法:

// Return a real object, automatic stack allocation.
Foo GetFoo1()
{
   Foo f;
   // Init f.
   return f;
}

// Use a smart, reference counted pointer that handles deallocation itself.
boost::shared_ptr<Foo> GetFoo2()
{
   boost::shared_ptr<Foo> f(new Foo);
   // Init f
   return f;
}

答案 1 :(得分:7)

答案取决于你究竟在做什么以及谁负责解除分配。

第一种方法:在堆上分配并返回。曾经调用该函数的人将负责删除返回的指针。

SomeObject* constructObject ()
{
   SomeObject* obj = new SomeObject ();
   return obj;
}

然后在其他一些功能

void functionThatNeedsObject ()
{
   SomeObject* obj = constructObject ();
   //You must delete obj when done
}

第二种方法:返回参考。您必须注意不要通过返回本地或临时变量来超出范围。

不要这样做:

int& DoubleValue(int nX)
{
   int nValue = nX * 2;
   return nValue; // return a reference to nValue here
} // nValue goes out of scope here

您可以返回对成员变量或作为参数传递给函数的变量的引用。

SomeStruct& RefFunction(SomeStruct& nX, SomeStruct& nY)
{
    return nX;
} //nX is still in scope because it was passed to us

答案 2 :(得分:6)

按值返回(人们错误地认为这很慢),或者,如果要返回多态类型的覆盖,则返回auto_ptr(或更好的C ++ 0x中的unique_ptr)。

您不使用shared_ptr的原因是您永远无法将指针从其中取出并使用不同的所有权语义。

永远不要返回对本地实例的引用。

答案 3 :(得分:4)

如果我创建一个纯粹要返回的实例,我将按值作为首选返回。

只有当对象类型实际上不可复制时,我才会考虑通过封装所有权转移的智能指针返回。

返回一个引用我保留用于返回对其所有权未被转移出该函数的对象的引用,即它已经被其他东西拥有并且它的存在在函数返回之后的定义时间内得到保证。

答案 4 :(得分:2)

如果您指的是Factory Method之类的内容,通常会返回一个指针。更好的是,返回一个智能指针,你不会因使用原始指针而产生更多泄漏。

示例:

std::auto_ptr<Gizmo>  MyFactory::CreateGizmo()
{
  return new Gizmo;
}

答案 5 :(得分:0)

这实际上取决于控制实例生命周期的实例范围。如果这是一个本地实例,您可能会按价值返回,但会产生构建和实施的成本。破坏对象两次(除非你使用RVO)。另一种选择是通过在函数内的堆中构造对象来返回指针。但是,使用这种方法,客户端将负责删除分配的内存和放大器。总是容易出现内存泄漏。这就是为什么你需要使用某种智能指针。 Anders Abel代码用代码示例清楚地说明了上述两种方法。顺便说一句,你不能返回对本地实例的引用,因为一旦函数结束,实例将超出范围。