MS Visual C ++ 2010 Ошибка: при предоставлении деструктора по умолчанию - PullRequest
1 голос
/ 29 декабря 2010

Я получаю ошибку запуска при предоставлении деструктора по умолчанию.Однако, если оставить компилятору предоставить деструктор по умолчанию, он работает безопасно.

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;
}

Ошибка времени выполнения:

Это может быть связано с повреждением кучи, что указывает на ошибку в Destructors.exe или любой из загруженных им библиотек DLL.1007 * Это также может быть связано с тем, что пользователь нажимает клавишу F12, когда фокус находится на шаблоне Templates.exe.

В окне вывода может быть больше диагностической информации.

Ответы [ 2 ]

4 голосов
/ 29 декабря 2010

new int(a_size) динамически распределяет один int с начальным значением a_size.

Я думаю, что вы имеете в виду new int[a_size], который динамически выделяет массив a_size int с.

(Вы также должны предоставить конструктор копирования и оператор копирования для вашего класса foo, так как класс по умолчанию не будет работать правильно. Лучше было бы заменить элемент указателя m_array на std::vector<int> для управления динамически выделяемая память автоматически, и тогда вам не придется беспокоиться об определяемом пользователем деструкторе, конструкторе копирования и операторе назначения копирования.)

2 голосов
/ 29 декабря 2010

Вы выделили один int, а затем попытались удалить массив.

Правильный способ выделения массива int s:

new int[a_size]

Обратите внимание наквадратные (массивы) скобки, а не круглые скобки.

Как всегда, вы должны следовать правилу из трех и определить конструктор копирования.

РЕДАКТИРОВАТЬ: показывать мой предпочтительныйстиль:

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;
}
...