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

Освобождение памяти в деструкторе класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
nerti
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 5
29.07.2014, 16:30     Освобождение памяти в деструкторе класса #1
Перечитал по этому поводу много информации. Главный вопрос.
Есть класс в котором происходит динамическое выделение памяти.
В конструкторе я эту память хочу удалить.
Пробовал много методов вроде создания отдельной функции внутри класса, которая освобождает память и встраивания ее в деструктор. Постоянно вылетает ошибка.
Вопрос при удалении объекта класса динамически выделенная память сама по себе ведь не освобождается если не освободить ее явно или освобождается и это порождает ошибку?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class matrix
{
    int rows;
    int columns;
    double **Farray;
   public:
     matrix(int i = 4, int j = 4) { rows = i, columns = j;}
     double** fill(double *ptr);
     double** multiply(double** secondmatrix);
     bool operator==(matrix right); 
     void operator*(matrix ob);
         ~matrix () {
         for (int count = 0; count <  rows; count++)
     delete [] Farray[count];
          }
};
//---------------------------------------------------
 bool matrix :: operator==(matrix right) {
     return right.rows == rows; }
..............................
int main()
{
run()
system("pause");
return 0;
}
............................
...........................
void run()
{
matrix ob1, ob2;
.......................
    if(ob1 == ob2) 
      ob1*ob2;
    else 
      cout << "Matrixes can't be multiplied \n";
}
............................
//---------------------------------
//--------------------------------
//Память выделяется здесь.
void matrix :: operator*(matrix ob)
{
    cout << "The resultant matrix after multiplication: \n";
    double **result = new double* [rows]; 
            for (int count = 0; count < rows; count++)
            result[count] = new double [columns];
           for (int i = 0; i < rows; i++) {
            for (int k = 0; k < columns; k++) {
                double sum = 0;
             for (int e = 0; e < columns; e++) {
                 sum += Farray[i][e] * ob.Farray[e][k];
........................................................................................
Под многоточиями я пропускал ненужные функции и строки программы. Могу сказать все корректно работает. Если убрать деструктор из класса то все прекрасно работает и ошибка не вылетает. Если же описать действия, которые должны выполняться при вызове деструктора то вылетает ошибка.
А и ошибка вылетает по ходу выполнения программы, а не на этапе компиляции в месте, где должны умножаться матрицы. И вывод происходит левых значений.

Если имеет значение то делал в - VS2010.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,964
29.07.2014, 16:59     Освобождение памяти в деструкторе класса #2
Есть класс в котором происходит динамическое выделение памяти.
Не происходит. Потому что new нету.
nerti
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 5
29.07.2014, 17:06  [ТС]     Освобождение памяти в деструкторе класса #3
C++
1
2
3
4
5
6
7
//Память выделяется здесь.
void matrix :: operator*(matrix ob)
{
    cout << "The resultant matrix after multiplication: \n";
    double **result = new double* [rows]; 
            for (int count = 0; count < rows; count++)
            result[count] = new double [columns];
А это что не считается за выделение памяти?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,964
29.07.2014, 17:10     Освобождение памяти в деструкторе класса #4
А это что не считается за выделение памяти?
А оно из конструктора как-то вызывается? matrix(int i = 4, int j = 4) оставляет в Farray рандомный мусор. Потом вы с этим мусором что-то делаете и программа падает. Все логично.
nerti
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 5
29.07.2014, 17:19  [ТС]     Освобождение памяти в деструкторе класса #5
Т.е. если выделение памяти не происходит в конструкторе класса то и в деструкторе ее нельзя освобождать?

И как лучше поступить в моем случае. Если выделение памяти происходит в процессе умножения как ее лучше удалять?
Если выделение памяти для Farray происходит во время вызова функции объекта класса. Создать отдельную функцию освобождения памяти и вызывать ее, когда уже данные не нужны?
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,964
29.07.2014, 17:23     Освобождение памяти в деструкторе класса #6
И как лучше поступить в моем случае. Если выделение памяти происходит в процессе умножения как ее лучше удалять?
C++
1
2
3
4
5
6
7
8
matrix(int i = 4, int j = 4):rows(i),columns(j),Farray(0){}
~matrix()
{
    if(Farray)
    {
        ....
    }
}
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2014, 17:34     Освобождение памяти в деструкторе класса #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от nerti Посмотреть сообщение
C++
1
void operator*(matrix ob);
фигасе прикол
C++
1
2
3
4
5
6
const matrix operator*(const matrix &ob)
{
matrix tmp;
//тут, создаете объект (пустой) в него записываете результат умножения матрицы this на ob
return tmp;
}
Обязательно определить констурктор копии и присваивания!
и обязательно в конструкторе выделяйте память, иначе получается нелогично поведение!!!

Добавлено через 1 минуту
Цитата Сообщение от nerti Посмотреть сообщение
C++
1
2
3
4
5
~matrix ()
{
for (int count = 0; count < rows; count++) 
delete [] Farray[count]; 
}
C++
1
2
3
4
5
6
~matrix ()
{
for (int count = 0; count < rows; count++) 
delete [] Farray[count]; 
delete[]Farray;//!!!!!!!!!
}
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,964
29.07.2014, 17:38     Освобождение памяти в деструкторе класса #8
и обязательно в конструкторе выделяйте память, иначе получается нелогично поведение!!!
И что вам в ленивой инициализации нелогичного? Тем более если все происходит у класса "под капотом", куда конечный пользователь все равно в 99% случаев не полезет. На сколько такая инициализация здесь оправдана - другой вопрос.
nerti
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 5
29.07.2014, 17:39  [ТС]     Освобождение памяти в деструкторе класса #9
Ну в моем случае не нужно было записывать результат умножения в какой-либо объект.
И в моей функции происходило умножение 2х матриц и запись их в массив, который записывается в файл сразу.
Я подумал конструктора копирования не нужно для передачи его.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2014, 17:46     Освобождение памяти в деструкторе класса #10
Цитата Сообщение от Renji Посмотреть сообщение
И что вам в ленивой инициализации нелогичного?
искать после этого падения, потому что видите ли забыли вызвать ф-ции Init которая выделяет память....

Добавлено через 1 минуту
Цитата Сообщение от nerti Посмотреть сообщение
происходило умножение 2х матриц и запись их в массив, который записывается в файл сразу
тогда сделайте метод который не будет являться членом класса, и будет принимать 2 объекта класса matrix причем не будет их копировать т.е в этот метода передавайте ссылкой или указателем
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,964
29.07.2014, 17:51     Освобождение памяти в деструкторе класса #11
искать после этого падения, потому что видите ли забыли вызвать ф-ции Init которая выделяет память....
C++
1
2
3
4
5
6
double**get_farray()
{
    if(!Farray)
        Init();
    return Farray;
}
Да, кодить ленивую инициализацию сложнее, но сама концепция от этого нелогичной не становится.
aLarman
29.07.2014, 17:57
  #12

Не по теме:

Renji, вот попробуйте это все засунуть новичку в голову, который может вовсе и не понимать что такое класс и как работает выделение памяти, просто если учишься - пиши все полностью, если уже умеешь и понимаешь пиши "ленивую инициализацию", извращайся и т.д, ибо понимаешь что делаешь

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2014, 18:13     Освобождение памяти в деструкторе класса
Еще ссылки по теме:

Освобождение памяти для члена класса C++
C++ Освобождение памяти в C++
C++ Об удалении указателя в деструкторе класса

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

Или воспользуйтесь поиском по форуму:
nerti
0 / 0 / 0
Регистрация: 29.07.2014
Сообщений: 5
29.07.2014, 18:13  [ТС]     Освобождение памяти в деструкторе класса #13
Да спасибо решилось все уже определением конструктора копирования. На будущее буду знать.
Yandex
Объявления
29.07.2014, 18:13     Освобождение памяти в деструкторе класса
Ответ Создать тему
Опции темы

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