Mahesh
Mahesh

Reputation: 34625

MS Visual C++ 2010 Error: On provision of default destructor

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

Answers (2)

Ben Voigt
Ben Voigt

Reputation: 283634

You allocated a single int, and then tried to delete an array.

The proper way to allocate an array of ints 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

CB Bailey
CB Bailey

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 ints.

(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

Related Questions