2010-11-23 84 views
5

在審查我的代碼,我看到一些「醜陋」的結構我用,在一個類(稱爲「地圖」),我有一個包含「數據」類的載體:內存管理和標準::分配器

std::vector<PointerToHUGEClass> vector; 

其中PointerToHUGEClass就像名稱所描述的那樣。 (儘管指向的對象也由map類擁有,並且在構造函數中使用「new」參數創建)。這一切都很好(目前)。不過,我仍然認爲這更多的是解決方法。

只有原因我使用「PointerToHUGEClass」而不是「HUGEClass」,是因爲我想確保對象沒有從堆棧中聲明。然而,在我理解分配器之前,我做了這件事。現在我認爲分配器的任務或多或少是確保內存不是從堆棧中聲明的。

我的問題:

  • 上午我在承擔分配器糾正負責從項目的內存管理? (並確保它是從stack/freestore/heap/whatever聲明的)
  • std :: allocator是做什麼的? - 它是從堆棧還是從堆中聲明?
  • (跟上一個問題):如果我將堆棧中聲明的項目複製到數據結構中,它仍然在堆中聲明?再次

感謝, paul23

+0

@Simone:嗯,代碼應讀取`std :: vector `或`std :: vector `感謝您的注意。 (雖然它並沒有真正改變我的問題,但問題總的來說更爲一般,因爲它已經是我一直想知道的一年了) – paul23 2010-11-23 10:12:55

回答

8
  • 我是在假設分配器糾正負責從項目的內存管理? (並確保它從棧/的FreeStore /堆/任何聲明)

不,你不是。分配器只是糖衣塗層超過newdelete,並且一般負責決定,其中內存將被分配。致電allocatedeallocateconstructdestruct的責任是對其用戶(這意味着在這裏,std::vector)。從你的角度來看,它會是自動的,畢竟這是重要的。

  • std :: allocator是做什麼的? - 它是從堆棧還是從堆中聲明?

std::allocator的任務是利用::operator new(size_t)分配,因此它取決於全球new運營商的定義。一般來說,這意味着堆。該堆棧用於具有自動存儲持續時間的對象。

  • (從以前的問題跟進):如果我複製在堆棧中的數據結構中聲明的項目仍然在堆中聲明?

如果您複製一個項目,然後將副本分配到您複製它的位置。這意味着將一個項目從堆棧複製到堆中。然後您有兩個對象副本,這意味着一個副本上的更改不會反映在另一個副本上。

但是當心,我們說的是默認複製模式,即拷貝。如果你複製一個對象,它會被複制一切正常;如果您複製指針,則只會複製指針,而不是指向的數據。

+0

你能告訴我std :: allocator要求使用:: operator new嗎?我找不到標準中的參考。 – Simone 2010-11-23 10:25:13

0

您的答案:

  • 是的,你是正確的。無論如何,如果容器的模板類型是一個指針,就像你的情況一樣,容器將爲指針分配/釋放內存,而不是指針所指向的對象!

  • 這是由執行,在標準的20.2.5美元描述了分配器的要求。

  • 既然你在存儲指針,我擔心這個問題的答案會讓你困惑。如果您在容器中複製了指向堆棧中分配的對象的指針,則您的對象將保留在堆棧中。一旦你離開作用域,它將被破壞,你將在容器中有一個無效的指針。

HTH