Re: Test Dynamic Memory
On 13 Dec., 21:10, Immortal Nephi <Immortal_Ne...@hotmail.com> wrote:
I notice that some codes do not have to test dynamic memory to
determine if dynamic memory is available or not. It is said in Deitel
How to Program C++ book.
If it says so, it is a bad book.
Is it necessary to test dynamic memory if memory is very small like
less than 256 bytes? The test should fail and prevent you from doing
class constructor.
If new fails, standard behaviour is to throw std::bad_alloc. Some very
old compilers got that wrong, noticeably VC6.0. If you use that
compiler and can't change, you can change a setting to make it
standards-compliant in that respect.
array class is already constructed before dynamic memory is tested.
If it fails, error message is displayed before exit() function
terminates the program. If I decide to allow the program running
after dynamic memory reported out of memory, then array class should
use destructor to clean up all data members and release array class
from the memory.
You do realize, that you are just creating a dumped-down version of
std::vector? So your class is useless if not as an exercise. Also, you
are missing a lot of stuff - an assignment operator and a copy
constructor needs to be written.
For example:
class array
{
public:
array( int size )
{
m_pArray = new int[ size ];
m_size = size;
if( m_pArray == 0 )
{
// Display Error Message =
-- out of memory
// Close other applicatio=
n and try again or
// use exit() function
This behaviour is better delegated into the new_handler function.
// if( yes )
// exit();
// else ( no and continue=
)
m_bOutofMemory = true;
return;
}
}
Prefer initialization rather than assignment. Your constructor should
be
array( int size ): m_size(size),m_pArray(new int[ size ]) {}
Also notice that m_bOutofMemory only gets initialised in case there is
a memory leak, so you are likely to run into undefined behaviour in
TestMemory.
~array()
{
if( m_pArray != 0 )
There is no need for this check.
{
delete [] m_pArray;
m_pArray = 0;
And no need for this assignment.
}
}
bool TestMemory()
{
return m_bOutofMemory;
}
private:
int m_size;
int *m_pArray;
bool m_bOutofMemory;
That hungarian notation really creeps me out.
};
int main()
{
array *a = new array( 5 );
Why do you want to allocate a dynamically? This is just silly. Use
array a(5);
if( a->TestMemory() == true )
Why do you compare to true - this is just obfuscation. Prefer:
if( a->TestMemory() )
delete a;
// Continue the program after
// exit() function is not invoked.
system( "pause");
return 0;
Here you have a memory leak - because of the dynamic allocation of a.
}