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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
#1

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

07.04.2012, 16:56. Просмотров 547. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос деструктор не может очистить память (C++):

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

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

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

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

Почему может не работать деструктор? - C++
#include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; class Person { private: char* name; public: Person(char*...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.04.2012, 17:09 #2
оператор + возвращает объект. чтобы его создать, вызывается дефолтный конструктор копирования. дефолтный вам не подходит. нужно его переопределять. из-за дефолтного у вас происходит два удаления по одному и тому же указателю. то же самое можно сказать и про оператор =. тот, что генерирует компилятор вам не подходит. нужно писать свой, и делать в нем глубокое копирование.
1
3BEPb_TyTa
18 / 18 / 1
Регистрация: 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
Привет! Вот еще темы с ответами:

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

Память не может быть прочитала - C++
Здравствуйте, вот есть код: struct Dyn{ Syt select; Dyn* next; }; ............

Память не может быть прочитана! - C++
Проблема возникает при копировании одного массива в другой. Я вроди просмотрел и размерности вроди совпадают, но может быть я что то...

По каким причинам память не может быть выделена динамически? - C++
Что это могут быть за причины?


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

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

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