Форум программистов, компьютерный форум CyberForum.ru

деструктор не может очистить память - C++

Восстановить пароль Регистрация
 
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
07.04.2012, 16:56     деструктор не может очистить память #1
Всем привет. Ребят, проблема такая. Есть класс который предназначен для хранения двумерной матрицы.
Вот:
C++
1
2
3
4
5
6
7
8
9
class intArr{
    int** arr;
    int xSize, ySize;
public:
    ~intArr();
    intArr(int x, int y, int min, int max);
    void show();
    intArr operator + (intArr&);
};
xSize - кол-во столбцов, ySize - кол-во строк. arr - указатель для хранения матрицы в хипе. Вот конструктор:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
intArr::intArr(int x, int y, int min = -9, int max = 9){
    xSize = x;
    ySize = y;
    arr = new int*[ySize];
    for(int i = 0; i < ySize; i++){
        arr[i] = new int[xSize];
    }
    for(int i = 0; i < ySize; i++){
        for(int j = 0; j < xSize; j++){
            arr[i][j] = rand()%19 - 9;
        }
    }
}
Далее я перегружаю оператор "+". Для этого в описании оператора я создаю новый объект нужной размерности с помощью описанного выше конструктора и в него поэлеметно записываю нужные мне значения элементов матрицы (в данном случае сумму соответсвующих элементов матриц-операндов) и возвращаю этот новый объект на выходе.

C++
1
2
3
4
5
6
7
8
9
intArr intArr::operator +(intArr &a){
    intArr b(xSize, ySize);
    for(int i = 0; i < ySize; i++){
        for(int j = 0; j < xSize; j++){
            b.arr[i][j] = arr[i][j] + a.arr[i][j];
        }
    }
    return b;
}
И всё бы было хорошо если бы не деструктор. Деструктор у меня освобождает память в хипе, выделенную в конструкторе под матрцу.

C++
1
2
3
4
5
6
intArr::~intArr(){
    for(int i = 0; i < ySize; i++){
        delete [] arr[i];
    }
    delete [] arr;
}
Вот мэйн:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(int args, char* arg[])
{   
    srand((unsigned)time(0));
    intArr x(5,3), y(5,3);
    x.show();
    cout<<endl;
    y.show();
    cout<<"---------------------"<<endl;
    x = x + y;
    x.show();
    system("pause");
    return EXIT_SUCCESS;
}
В строке где я пытаюсь сложить 2 матрцы ("x = x + y;") происходит ошибка. Не при компиляции, а уже при работе. И тут два вопроса. Во первых - почему и где в этой строке деструктор вызывается аж 2 раза. И во-вторых - почему во 2ой раз он нормально срабатывать не хочет.

ах да, ошибка - Unhandled exception at 0x60c831ea in draft.exe: 0xC0000005: Access violation reading location 0xfeeefee2.

Помогите, плиз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2012, 16:56     деструктор не может очистить память
Посмотрите здесь:

Память не может быть прочитана! C++
Динамическая память (строки), деструктор C++
Ругается на деструктор (выделял динамически память). Почему? C++
Память не может быть прочитала C++
C++ Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Деструктор класса. Как правильно очистить память? C++
Очистить динамическую память, выделенную под член структуры C++
Деструктор и динамическая память C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.04.2012, 17:09     деструктор не может очистить память #2
оператор + возвращает объект. чтобы его создать, вызывается дефолтный конструктор копирования. дефолтный вам не подходит. нужно его переопределять. из-за дефолтного у вас происходит два удаления по одному и тому же указателю. то же самое можно сказать и про оператор =. тот, что генерирует компилятор вам не подходит. нужно писать свой, и делать в нем глубокое копирование.
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
07.04.2012, 17:42  [ТС]     деструктор не может очистить память #3
Вроде разобрался. Спасибо, DU
Yandex
Объявления
07.04.2012, 17:42     деструктор не может очистить память
Ответ Создать тему
Опции темы

Текущее время: 09:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru