Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
3BEPb_TyTa
18 / 18 / 4
Регистрация: 18.05.2010
Сообщений: 83
1

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

07.04.2012, 16:56. Просмотров 623. Ответов 2
Метки нет (Все метки)

Всем привет. Ребят, проблема такая. Есть класс который предназначен для хранения двумерной матрицы.
Вот:
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.

Помогите, плиз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2012, 16:56
Ответы с готовыми решениями:

Деструктор класса. Как правильно очистить память?
Добрый день! Написал прогу бинарного дерева поиска, все работает, но нужен...

Деструктор и динамическая память
Вечер добрый, форумчане. Создал класс с матрицами, динамически выделил память....

Динамическая память (строки), деструктор
Привет. Бьюсь уже час, помогите разобраться. Написал программу, в одной...

Ругается на деструктор (выделял динамически память). Почему?
Вот код: #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;time.h&gt; #include...

Почему может не работать деструктор?
#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class Person...

2
DU
1486 / 1132 / 164
Регистрация: 05.12.2011
Сообщений: 2,279
07.04.2012, 17:09 2
оператор + возвращает объект. чтобы его создать, вызывается дефолтный конструктор копирования. дефолтный вам не подходит. нужно его переопределять. из-за дефолтного у вас происходит два удаления по одному и тому же указателю. то же самое можно сказать и про оператор =. тот, что генерирует компилятор вам не подходит. нужно писать свой, и делать в нем глубокое копирование.
1
3BEPb_TyTa
18 / 18 / 4
Регистрация: 18.05.2010
Сообщений: 83
07.04.2012, 17:42  [ТС] 3
Вроде разобрался. Спасибо, DU
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 17:42

Очистить память динамического массива
Вот в этой программе добавить очищение памяти динамического массива. пробовал...

Очистить динамическую память, выделенную под член структуры
Объявление и инициализация объекта: pupil B = Constructor(&quot;MyName&quot;, 18, 50);...

Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
Почему я делаю виртуальным деструктор A, а в таблице виртуальных функций лежит...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru