簡體   English   中英

在 C++ 中使用 new 分配的特定數組塊 delete[]

[英]delete[] a specific array block allocated with new in c++

我正在用 C++ 編寫一個簡單的堆棧程序。 我已經動態分配了數組。 我想知道是否有任何方法可以刪除(解除分配)數組的特定塊。

  int *arr = NULL ;
  arr = new int[some_size];
  .
  .
  .
  .
  //now suppose I want to deallocate a specific block
  //suppose 
  int i = 4;

  //can I do something like

  delete[i] arr;

我知道這是一個愚蠢的問題,但我仍然想知道。 謝謝你。

只能解除分配整個分配 - 而不是它的一部分。 沒有像delete[i]這樣的語法。 只有直接從new[]返回的指針可以傳遞給delete[]


但是,您可以實現自己的分配器,該分配器可以處理全局分配器中的單個塊,從而提供可以單獨釋放的較小分配。 這是一項高級技術:不適合初學者。 它(可能)不是您實現任何程序所需要做的事情。 但在某些情況下,如果您知道自己在做什么,它對優化很有用。

我將如何實現我自己的分配器

從全局分配器中分配一些內存 M。

編寫一個以字節數為參數的函數。 在函數中,使用一些數據結構來跟蹤 M 的哪些部分先前已分配。 從 M 中選擇一個尚未分配的字節范圍。 在數據結構中將其標記為已分配,返回指向該范圍開頭的指針。

編寫另一個將指針作為參數的函數。 將為該分配保留的內存標記為空閑。

更好的是,使用這些函數實現一個符合標准庫中分配器概念的類型,以便分配器可以用作標准容器的模板參數。

數組是一種數據結構,可以存儲相同類型元素的固定大小的順序集合。

數組有一個非常特殊的連續內存分配特性,這意味着編譯器將連續的內存塊分配給一個數組。它賦予了數組優勢,例如

  1. 元素的隨機訪問
  2. 二分查找
  3. 更少的內存消耗(因為不需要指向下一個元素的指針)

因此,通常不可能從連續內存中刪除特定塊。 因此,針對這個特定問題,發明了鏈表

但是在 C++ 中,我們有 std:vector 這些不是靜態數組,而是比靜態數組占用更多空間的向量。

假設該問題被修改為向量,我們可以使用 pop_back 函數或擦除函數。

1.pop_back:簡單地刪除最后一個向量。

    int main()
{
    std::vector<int> numbers;

    print(numbers); 

    numbers.push_back(5);
    numbers.push_back(3);
    numbers.push_back(4);

    print(numbers); 

    numbers.pop_back();

    print(numbers); 
}

2.erase:從容器中擦除指定的元素。

  • 移除 pos 處的元素。
  • 刪除范圍 [first, last) 中的元素。

https://www.cplusplus.com/reference/string/string/erase/

暫無
暫無

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

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