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

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

Войти
Регистрация
Восстановить пароль
 
vasyapupkin89
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
#1

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

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

C++ Выделение памяти под переменную
Выделение памяти под динамическую матрицу в С C++
Выделение памяти под масссив C++
Выделение памяти под строку C++
Выделение памяти под wchar_t C++
C++ Выделение памяти под структуры
Выделение памяти под массив C++
Выделение памяти под матрицу в конструкторе C++
Выделение памяти под указатель C++
Выделение памяти под массивы C++
Выделение памяти под матрицу C++
C++ Выделение памяти под матрицу

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3584 / 1364 / 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++
3584 / 1364 / 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     Выделение памяти под матрицу
Ответ Создать тему
Опции темы

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