-4

我有一個包含std :: uint_8指針的類,應該調用析構函數來刪除分配的內存。我遇到的問題是發生編譯器錯誤,並指出內存未分配,但我知道我將其分配在我的默認構造函數中。 這裏是我的默認構造函數:析構函數不刪除分配的內存

BigInteger::BigInteger() { 
    unsigned char aArray [4]; 
    aArray[0] = 0; 
    m_number = new unsigned char[4] 
    m_number = aArray; 
    m_digitCount = 0; 
    m_sizeReserved = 4; 
} 

,這裏是我的析構函數:

BigInteger::~BigInteger() { 
    delete [] m_number; 
} 
+10

你期望'm_number = aArray;'做什麼? – tkausl

+0

您用'new'分配'm_number',但在下一行重新分配給本地數組。 –

+0

這不僅是一個內存泄漏,但如果您稍後使用'm_number',它是未定義的行爲 – NathanOliver

回答

2

unsigned char aArray [4]這裏您在堆棧上創建了4個元素的數組。一旦構造函數完成,這些將會超出範圍。

m_number = new unsigned char[4]現在你在堆上創建4個元素。你分配內存,你將負責清理它。不是一個問題,你在析構函數中這樣做。

m_number = aArray;現在你改變了m_number指向的內容,有效地丟失了指向你分配的內存的指針。現在你有一個泄漏。

任何使用m_number以外的構造函數現在都是未定義的行爲,因爲你正在訪問你不再擁有的內存。

delete [] m_number;現在你正在刪除你不擁有的內存。 UB。

不要重新分配m_number,你將不會有這些問題。更好的是,使用std::vector並觀看這些手動內存管理問題。

0

你有記憶的經典場景泄漏。從本質上說你在做什麼是以下幾點:

  1. 分配內存(m_number = new unsigned char[4]
  2. 覆蓋指向該分配的內存指針(m_number = aArray
  3. 決不刪除分配的內存爲您不再知道它在哪裏 - 你已經失去了指針(它得到覆蓋)
1

那行

m_number = aArray; 

將局部變量的地址分配給m_number

該地址不能與delete [] m_number;一起使用,分配new unsigned char[4]的內存地址將被覆蓋並在該分配後丟失。