簡體   English   中英

從函數C ++返回指針或引用

[英]Returning pointers or references from functions C++

如果要從方法返回實例,是否要創建對象並向后發送指針或引用? 什么是正確的方法和方法簽名?

在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;
}

答案取決於您正在做什么以及誰負責解除分配。

第一種方法:在堆上分配並返回。 誰曾調用該函數將負責刪除返回的指針。

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

要么按值返回(人們錯誤地認為這很慢),或者,如果要返回多態類型的覆蓋,則返回auto_ptr(或更好的C ++ 0x中的unique_ptr)。

你不使用shared_ptr的原因是你永遠不能從指針中取出指針並使用不同的所有權語義。

永遠不要返回對本地實例的引用。

如果我創建一個純粹要返回的實例,我將按值作為首選返回。

只有當對象類型實際上不可復制時,我才會考慮通過封裝所有權轉移的智能指針返回。

返回引用我保留用於返回對其所有權未被轉移出函數的對象的引用,即它已經被其他東西擁有並且它的存在在函數返回之后的定義時間之前得到保證。

如果您指的是類似工廠方法的東西,通常會返回一個指針。 更好的是,返回智能指針,並且您不會因使用原始指針而產生更多泄漏。

例:

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

這實際上取決於控制實例生命周期的實例的范圍。 如果這是一個本地實例,您可以按值返回,但會產生構造和銷毀對象兩次的成本(除非您使用RVO )。 另一種選擇是通過在函數內的堆中構造對象來返回指針。 但是,使用這種方法,客戶端將負責刪除分配的內存,並且總是容易出現內存泄漏。 這就是為什么你需要使用某種智能指針。 Anders Abel代碼用代碼示例清楚地說明了上述兩種方法。 順便說一句,你不能返回對本地實例的引用,因為一旦函數結束,實例將超出范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM