[英]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.