簡體   English   中英

C ++分配器在銷毀/復制/移動時應如何處理其分配的內存?

[英]How should a C++ allocator handle its allocated memory when it is destroyed/copied/moved?

我目前正在編寫一個應該由C ++標准數據結構使用的分配器,即,它實現了分配器的概念。

分配器非常簡單:它分配x對象的塊,如果當前塊未滿,則始終分發下一個對象,否則分配一個新的塊。

現在我的問題是:當分配器被銷毀/復制/移動時,如何處理這些塊? 分配器概念沒有說明在這些情況下必須發生的情況。

這是我的想法:

  • 銷毀:分配器可能銷毀其所有塊。 但是,使用任何已分配對象的對象都不會超過分配器的壽命。
  • 復制:最直接的想法是復制塊。 但是,再三考慮,這沒有任何意義:沒人知道復制的塊中對象的地址,因此僅復制它們就沒有任何好處。 也許復制的分配器應以空塊列表開頭。
  • 移動:應該將塊移動到新的分配器。 舊的應該留空的塊列表。

我的假設正確嗎? 如果沒有,那么為什么在何處定義?

分配器通常是輕量級的對象,可以在周圍復制和銷毀,例如在標准容器類中。 因此,他們不應該自己執行繁重的內存管理,而應將其中繼給其他一些永久性的內存管理器對象。 如果這樣做,則內存塊的生存期不取決於分配程序的生存期,而是取決於內存管理器對象的生存期。 因此,一生的想法必須應用於兩種類型的對象:

分配器 (壽命短):

  • 復制/移動:將引用復制到內存管理器。
  • 破壞:不執行任何操作(內存管理器的外部生命周期管理)或可能破壞內存管理器,例如,每個分配器都具有與內存管理器的shared_ptr

內存管理器 (使用壽命長):

  • 應該禁止復制,復制管理器及其托管存儲是沒有意義的
  • 可以允許移動,但意義不大。 內存管理器甚至可以是類單例類,即一個不需要移動的固定實例。
  • 銷毀應涉及銷毀托管內存,因為沒有其他對象知道如何取消分配托管存儲。

暫無
暫無

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

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