簡體   English   中英

我該如何選擇在C ++中存儲對象的位置?

[英]How should I choose where to store an object in C++?

可能重復
在C ++中適當的堆棧和堆使用?

我開始從Java背景學習C ++,一個很大的區別是我不再被迫:

  1. 動態分配對象的內存
  2. 總是使用指針來處理對象

就像Java中的情況一樣。 但我很困惑何時應該做什么 - 你能建議嗎?

目前我很想開始做Java風格的一切

Thing *thing = new Thing();
thing->whatever();
// etc etc

除非你知道為什么需要它們,否則不要使用指針。 如果您只需要一段時間的對象,請在堆棧上分配它:

Object object;
object.Method();

如果需要將對象傳遞給函數,請使用引用:

int doStuff( Object& object )
{
    object.Method();
    return 0;
}

如果需要,只使用指針

  • 圖形復雜的數據結構或
  • 不同對象類型的數組或
  • 從函數或函數返回新創建的對象
  • 在有時需要指定“沒有對象”的情況下 - 然后使用空指針。

如果使用指針,則需要在不再需要這些對象時以及在對象的最后一個指針變為不可緩存之前解除分配對象,因為C ++沒有內置垃圾回收。 為簡化此操作,使用智能指針行std :: auto_ptr或boost :: shared_ptr。

那很糟。 你一定會忘記釋放它,如果你決定不這樣做,你必須處理異常,因為它不會自動釋放堆棧。 至少使用shared_ptr

shared_ptr<Thing> thing( new Thing() );
thing->whatever();

但它實際上取決於對象的大小和范圍。 如果你要在一個函數中使用它並且對象沒有超大,我建議在堆棧框架中分配它。

Thing thing;
thing.whatever();

但好處是你可以隨時決定分配一個新對象;-)

不要使用新的運營商,如果你能避免,否則它,這樣就在於內存泄漏和頭痛記住你的對象壽命。

C ++的方法是使用基於堆棧的對象,除非你復制它們,否則它們在離開作用域后會自行清理。 這種技術(稱為RAII)是一個非常強大的技術,每個對象都會照顧自己,有點像GC在Java中為你記憶的方式,但具有清理的巨大優勢,因為它以確定的方式進行清理(即你知道什么時候它會被清理干凈)。

但是,如果您更喜歡使用對象的方式,請使用share_ptr,它可以為您提供相同的語義。 通常,您只能將shared_ptr用於非常昂貴的對象或非常復制的對象。

您可能需要在堆上分配實例的一種情況是,僅在運行時知道哪個實例將首先創建(與OOP相同):

 Animal* animal = 0;
 if (rand() % 2 == 0)
    animal = new Dog("Lassie");
 else
    animal = new Monkey("Cheetah");

您可能需要的另一種情況是,當您擁有一個不可復制的類時,其實例必須存儲在標准容器中(這要求其內容可以復制)。 其中一個變體是您可能希望存儲指向復制成本高的對象的指針(盡管這個決定不應該在手邊完成)。

在所有情況下,最好使用像shared_ptr和unique_ptr這樣的智能指針(它們被添加到標准庫中),因為它們可以為您管理對象的生命周期。

暫無
暫無

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

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