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

Выделение памяти под матрицу - C++

Восстановить пароль Регистрация
 
vasyapupkin89
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
24.12.2011, 17:57     Выделение памяти под матрицу #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
float   **AllocMat(int Rows, int Colomns)
                        {
                         float ** Mat;
                         try
                         {
                          Mat = new float * [Rows];
                          if( Mat == NULL ) throw 0;
                          for (int i = 0; i < Rows; i++)
                          {
                           Mat[i] = new float [Colomns];
                           if( Mat[i] == NULL ) throw i;
                          }
                         }
                            catch( int index )
                            {
                            cout << "Ошибка выделения памяти" <<endl;
                          for (int i = 0; i < index; i++)
                          {
                           delete [] Mat[i];
                           Mat[i] = NULL;
                          }
                          return NULL;
                            }
                         return Mat;}
Собственно вопрос будет ли освобождаться память из под **Mat втоматически по завершении работы функции?Мне кажеться что нет ( читал что в классах для всех указателей нужно писать деструктор). Если я прав то как мне выйти из положения, ведь очистить до возврата я не могу, а после нет к ниму доступа. Заранее благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2011, 17:57     Выделение памяти под матрицу
Посмотрите здесь:

C++ выделение памяти под переменную
Выделение памяти под динамическую матрицу в С C++
Выделение памяти под масссив C++
Выделение памяти под строку C++
C++ Выделение памяти под структуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.12.2011, 18:03     Выделение памяти под матрицу #2
Да, память выделяется в куче... Будет утечка памяти.
Цитата Сообщение от vasyapupkin89 Посмотреть сообщение
а после нет к ниму доступа.
С чего это?
vasyapupkin89
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
24.12.2011, 18:16  [ТС]     Выделение памяти под матрицу #3
ну так ведь функция будет завершена, а ** Mat локальный обьект... Я так думал... А каким образом это можно сделать??

Добавлено через 6 минут
все дописал после return Mat, вродь работает. Спасибо))))))
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.12.2011, 18:19     Выделение памяти под матрицу #4
Цитата Сообщение от vasyapupkin89 Посмотреть сообщение
return Mat;}
Так Вы же его вернули.
C++
1
2
3
4
5
6
7
8
// Где-то в main
 
int **a = AllocMat (10, 20);
// Поработали с ним
//Когда уже не нужен
for ( int i = 0 ; i < 10 ; ++i )
    delete []a[i];
delete []a;
vasyapupkin89
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
24.12.2011, 18:25  [ТС]     Выделение памяти под матрицу #5
go,

Открою вам всю душу, тогда получаеться у меня все хорошо.
И еше оператор перегрузки прокоментируйте пожалуйста.

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <tchar.h>
#include <iomanip.h>
//---------------------------------------------------------------------------
    class matrix    {
        float **mat;
            char n;
             int Rows,Cols;
 
        float   **AllocMat(int Rows, int Colomns)
                        {
                         float ** Mat;
                         try
                         {
                          Mat = new float * [Rows];
                          if( Mat == NULL ) throw 0;
                          for (int i = 0; i < Rows; i++)
                          {
                           Mat[i] = new float [Colomns];
                           if( Mat[i] == NULL ) throw i;
                          }
                         }
                            catch( int index )
                            {
                                cout << "Помилка виділення пам`яті" << endl;
                          for (int i = 0; i < index; i++)
                          {
                           delete [] Mat[i];
                           Mat[i] = NULL;
                          }
                          return NULL;
                            }
                         return Mat;
 
                          
 
                        }
       public:
        matrix(){
 
                          cout<<"\nНазвіть матрицю одним символом-->";
                           n=getch();
                           cout<<n;
                        cout<<"\n\nВведіть кількість рядків матриці -->";
                         cin>>Rows;
                            cout<<"\nВведіть кількість стовпчиків матриці -->";
                         cin>>Cols;
                                   mat=AllocMat(Rows,Cols);
 
                         cout<<"\nВиберіть спосіб ініціалізації матриці\n1 - Aвтоматично(випадковими числами.\n2 - Bручну.\n";
 
                         int i=0 ;
                        while (i<1) {     char d=getch();
                                            srand(time(0));
                                            if ('1'==d) {  for (int i = 0; i < Rows; i++) {
                                                                     for (int j = 0; j < Cols; j++) {
 
                                                                                                   mat[i][j]=random(100);
                                                                                                    }
                                                                                            }
                                                                                    i=3;}
 
                                            if ('2'==d) {  for (int i = 0; i < Rows; i++) { cout<<endl;
                                                                     for (int j = 0; j < Cols; j++) {
                                                                                                  cout<<n<<"["<<i<<"]["<<j<<"]-->";
                                                                                                  cin>>mat[i][j];
                                                                                                        }
 
                                                                                                }
                                                                                 i=3;   }
                                            };
        }
         void print_m(){
         cout<<"\n\t\tМатриця "<<n<<endl;
         for (int i = 0; i < Rows; i++) { cout<<endl;
            for (int j = 0; j < Cols; j++) {
                cout<<setw(5)<<left<<mat[i][j];
                }
            }
         }
        matrix (const matrix &a) { mat=AllocMat(a.Rows,a.Cols);
                  Rows=a.Rows;
                  Cols=a.Cols;
                  n=a.n;
                 for (int i = 0; i < Rows; i++) {
                       for (int j = 0; j < Cols; j++) {
                           mat[i][j]=a.mat[i][j];
                       }
                       }
                  }
     ~matrix (){
 
            for (int i = 0; i < Rows; i++)
                {
                    delete [] mat[i];
                    mat[i] = NULL;
                }
        delete [] mat;
        mat = NULL;
        }
     matrix (int Rowss,int Colss){
                   Rows=Rowss;
                   Cols=Colss;
            mat=AllocMat(Rows,Cols); n='C';}
    matrix operator*(const matrix &t){
          if (Cols==t.Rows) { matrix temp(Rows,t.Cols);   cout<<"ok";
                   for (int q=0; q<Rows; q++)
                {
                        for (int f = 0; f<t.Cols; f++)
                                {
                                int sum=0;
                                   for (int u=0; u<Rows; u++)
                                 { sum+= mat[q][u]*t.mat[u][f];}
                 temp.mat[q][f]=sum;}
}
               return temp; }   else {cout<<"\n\nМноження матриць не можливе.Розміри матриць не співпадають!!!!!!!!!"; }
        }
    };
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{     SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
         matrix mat1;
         mat1.print_m();
 
          matrix mat2;
         mat2.print_m();
 
         matrix mat3=mat1*mat2;
         mat3.print_m();
         system("pause");
    return 0;
}
//-----
Yandex
Объявления
24.12.2011, 18:25     Выделение памяти под матрицу
Ответ Создать тему
Опции темы

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