-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

'm_number'を' new'で割り当てますが、次の行でローカル配列に再割り当てします。 –

+0

メモリリークだけでなく、後で 'm_number'を使用すると未定義の動作です – NathanOliver

答えて

2

ここでは、スタックに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. をオーバーライド
  4. それがどこにあるか知っている - あなたは(それが上書きされてしまった)
1

その行そのポインタを失った

m_number = aArray; 

は、ローカル変数のアドレスをm_numberに割り当てます。

そのアドレスはdelete [] m_number;と一緒に使用できません。new unsigned char[4]で割り当てられたメモリアドレスは、その割り当て後に上書きされ、失われます。

関連する問題