Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
vasyapupkin89
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
1

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

24.12.2011, 17:57. Просмотров 1177. Ответов 4
Метки нет (Все метки)

Всем привет.

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 втоматически по завершении работы функции?Мне кажеться что нет ( читал что в классах для всех указателей нужно писать деструктор). Если я прав то как мне выйти из положения, ведь очистить до возврата я не могу, а после нет к ниму доступа. Заранее благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2011, 17:57
Ответы с готовыми решениями:

Выделение памяти под матрицу
Существует такой класс: class matr{ public: double **m; // адрес матрицы...

Выделение памяти под матрицу
Всем доброго времени суток! Есть такая проблема, у меня есть свой класс Cell....

Выделение памяти под матрицу в конструкторе
Почему компилятор подчеркивает эту строку?mCells = new GamePiece;...

Выделение памяти под динамическую матрицу в С
Люди помогите с 2 вопросами а то я чет не понимаю 1.Выделение памяти под...

Выделение памяти под масссив
Как занести данные в двумерный массив с клавиатуры? пользователь должен сам...

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

Добавлено через 6 минут
все дописал после return Mat, вродь работает. Спасибо))))))
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
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;
0
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;
}
//-----
0
24.12.2011, 18:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2011, 18:25

Выделение памяти под структуру
enrollee *p=new enrollee; после работы delete p; выбивает ошибку....

Выделение памяти под структуру
Доброго дня, товарисчи. В общем, возникла проблема при выделении памяти для...

Выделение памяти под массив
Требуется выделить память под матрицу. Будет ли следующий код работать...


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

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

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