Reputation: 34625
I am getting run-error on providing default destructor. However, if left to compiler to provide default destructor it is running safely.
class foo
{
private:
int m_size;
int* m_array;
public:
foo( int a_size ):m_size( a_size ), m_array( new int(a_size) ){}
~foo() {
delete [] m_array;
}
void setArray();
};
void foo::setArray()
{
for( int i=0; i<m_size; ++i )
m_array[i] = 10*i;
}
int main( int argc, const char* argv[] )
{
class foo obj( 6 );
obj.setArray();
system( "pause" );
return 0;
}
Runtime Error:
This may be due to a corruption of the heap, which indicates a bug in Destructors.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while Templates.exe has focus.
The output window may have more diagnostic information.
Thanks.
Upvotes: 1
Views: 180
Reputation: 283634
You allocated a single int
, and then tried to delete an array.
The proper way to allocate an array of int
s is:
new int[a_size]
Note the square (array) brackets, not parentheses.
As always, you should follow the rule of three and define a copy constructor as well.
EDIT: showing my preferred style:
class Foo
{
int m_size;
int* m_array;
public:
Foo( int const a_size )
: m_size(a_size)
, m_array(new int[a_size])
{}
~Foo( void )
{
delete [] m_array;
}
void setArray(void);
};
void Foo::setArray( void )
{
for( int i = 0; i < m_size; ++i )
m_array[i] = 10*i;
}
int main( void )
{
Foo obj(6);
obj.setArray();
system("pause");
return 0;
}
Upvotes: 2
Reputation: 791829
new int(a_size)
dynamically allocates a single int
with initial value a_size
.
I think you mean new int[a_size]
which dynamically allocates an array of a_size
int
s.
(You should also provide a copy constructor and copy assignment operator for your foo
class as the default ones will not do the correct thing. Better would be to replace your pointer member m_array
with a std::vector<int>
to manage the dynamically allocated memory automatically and then you wouldn't have to worry about a user-defined destructor, copy constructor and copy assignment operator.)
Upvotes: 4