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

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

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

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

24.12.2011, 17:57. Просмотров 946. Ответов 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++
Всем доброго времени суток! Есть такая проблема, у меня есть свой класс Cell. Мне нужно создать матрицу объектов этого типа и выделить под...

Выделение памяти под матрицу - C++
Существует такой класс: class matr{ public: double **m; // адрес матрицы int mi, my; //стобцы, строки //функции ...

Выделение памяти под динамическую матрицу в С - C++
Люди помогите с 2 вопросами а то я чет не понимаю 1.Выделение памяти под динамическую матрицу в С(напише плиз как обьявлется матрица и...

Выделение памяти под матрицу в конструкторе - C++
Почему компилятор подчеркивает эту строку?mCells = new GamePiece; //GameBoard.cpp #include &quot;GameBoard.h&quot; const int...

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

Выделение памяти под массив - C++
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...

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

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

Выделение памяти под переменную - C++
Драсте, уважаемые. Мне надо выделить переменную на 25мег, чтоб в ней хранить все просчёты выполненые программой. (Пробовал в BCB6 и в BCW...

Выделение памяти под массивы - C++
int **mas1 = new int*; for (int e = 0; e &lt; q; e++) mas1 = new int; int **mas2 = new int*; for (int q = 0; q &lt; e;...

Выделение памяти под указатель - C++
Здравствуйте форумчане,у меня возник маленький вопрос:) Почему sizeof(char) дает результат в 1 байт, а sizeof(char*) ) дает 4 байта.Как...

Выделение памяти под структуру - C++
Наведите пример выделения памяти под структуру


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

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

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