簡體   English   中英

如何釋放 new[] 分配的 memory?

[英]How to free memory allocated by new[]?

我目前正在嘗試創建類似矢量的容器。 它使用new[]分配的 memory 作為它的基礎。 當我需要擴展數組時會出現問題。 我用new[]分配了更大的 memory 塊,然后memcpy舊的 memory 到那里並delete[]舊的 memory。 問題是,試圖在內部存儲任何指針或任何包含指針的 object 會導致 memory 損壞。 所以我需要一種方法來釋放使用的 memory 而不會破壞里面的物體

編輯:一些代碼來理解問題:

template<typename T>
class myvector
{
private:
 T* _data;
 size_t _size, _capacity;
 static constexpr float multiplier = 1.5;
public:

void expand()
{
    size_t e_size = sizeof(T);
    size_t old_capacity = this->_capacity;
    this->_capacity = (unsigned long)(float(this->_capacity) * myvector::multiplier);
    T *tmp = new T[this->_capacity];
    memcpy(tmp, this->_data, e_size * (old_capacity));
    // this will destroy all the objects inside the container
    // which will result in destruction of any allocated memory
    delete[] this->_data; 
    // so now we have an array of invalid pointers. fun time
    this->_data = tmp;
}
}

如何釋放 new[] 分配的 memory?

使用delete[] 這必須在指針值丟失之前完成,並且必須在最后一次使用指針值之后完成。 它必須只做一次。 除數組new返回的指針外,不得對任何其他指針執行此操作。

問題是,試圖在內部存儲任何指針或任何包含指針的 object 會導致 memory 損壞。

那么你如何使用這些對象就有一個錯誤。 將此類對象存儲在模板中本身應該不是問題。

所以我需要一種方法來釋放使用的 memory 而不會破壞里面的物體

那根本不可能。 object 不能在沒有存儲的情況下存在(此處不適用的特殊情況除外)。

 delete[] this->_data; // so now we have an array of invalid pointers. fun time

為什么會有一個無效指針數組? 數組中的指針是否指向this->_data

實際上,您的數據結構的元素沒有穩定的地址。 擴展將使對元素的任何引用無效。 如果您需要這種穩定性,那么您必須使用基於節點的數據結構,例如鏈表。


您的模板確實有一個限制,即它僅針對可簡單復制的類進行了明確定義。 也許你忽略了這個限制。 擺脫這個限制很容易:只需使用std::copy (或者可能來自<algorithm>std::move ,取決於您需要的異常安全保證)而不是std::memcpy

暫無
暫無

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

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