Destructor not deleting allocated memory
I have a class that includes a std::uint_8 pointer and the destructor should be called to delete the allocated memory. The issue I'm having is that a complier error occurs and states that the memory was not allocated, but I know I allocated it in my default constructor. Here's my default constructor:
BigInteger::BigInteger() {
unsigned char aArray [4];
aArray[0] = 0;
m_number = new unsigned char[4]
m_number = aArray;
m_digitCount = 0;
m_sizeReserved = 4;
}
and here's my destructor:
BigInteger::~BigInteger() {
delete [] m_number;
}
unsigned char aArray [4] here you create an array of 4 elements on the stack. These will go out of scope once the constructor has finished.
m_number = new unsigned char[4] now you create 4 elements on the heap. You allocate the memory and you'll be in charge of cleaning it up. Not an issue, you do so in the destructor.
m_number = aArray; now you change what m_number is pointing to, effectively losing a pointer to the memory you allocated. Now you have a leak.
Any use of m_number outside of this constructor is now undefined behaviour, because you're accessing memory you no longer own.
delete [] m_number; now you're deleting memory you don't own. UB.
Don't reassign m_number and you won't have these issues. Better yet, use std::vector and watch as these manual memory management problems melt away.
That line
m_number = aArray;
assigns a local variable's address to m_number .
That address cannot be used in conjunction with delete [] m_number; , the memory address allocated with new unsigned char[4] is overridden and lost after that assignment.
You have a classical scenario of a memory leak . In essence what you are doing is the following:
m_number = new unsigned char[4] ) m_number = aArray ) 上一篇: 哪里分配了变量引用,堆栈还是堆?
下一篇: 析构函数不删除分配的内存
