HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Вопрос по C++
Возвращение объекта, содержащего указатели на динамическую память
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Вопрос по C++

В заголовочном файле:

C++ Source Code:
1
#ifndef MATRIX_H
2
#define MATRIX_H
3
 
4
#include <iomanip>
5
#include <iostream>
6
#include <cstdlib>
7
 
8
using std::endl; using std::cerr;
9
using std::ostream; using std::istream;
10
using std::setw;
11
 
12
class CMatrix
13
{
14
  friend ostream &operator<<(ostream&, const CMatrix&);
15
 
16
public:
17
  CMatrix(unsigned short = 3, unsigned short = 3);
18
  ~CMatrix();
19
 
20
  CMatrix& operator=(const CMatrix&);
21
 
22
  friend CMatrix operator+(const CMatrix &, const CMatrix &);
23
 
24
  void randfill(const unsigned short);
25
 
26
private:
27
  int **mptr;				//матрица элементов
28
  unsigned short rows;	//количество строк в матрице
29
  unsigned short cols;	//количество столбцов в матрице
30
};
31
 
32
typedef CMatrix matrix;
33
 
34
CMatrix::CMatrix(unsigned short m, unsigned short n)
35
{
36
  if(m==0) m=1;
37
  if(n==0) n=1;
38
  rows = m;
39
  cols = n;
40
  mptr = new int*[m];
41
  for (unsigned short i=0; i<m; i++)
42
    mptr[i]=new int[n];
43
 
44
  for (unsigned short i=0; i<m; i++)
45
    for (unsigned short j=0; j<n; j++)
46
      mptr[i][j]=0;
47
    return;
48
  }
49
 
50
CMatrix::~CMatrix()
51
{
52
  for (int i=0; i<rows; i++)
53
    delete[]mptr[i];
54
  delete[]mptr;
55
}
56
 
57
ostream &operator<<(ostream &output, const CMatrix &M)
58
{
59
  for (unsigned short i=0; i<M.rows; i++)
60
  {
61
    output << endl;
62
    for (unsigned short j=0; j<M.cols; j++)
63
      output << setw(4) << M.mptr[i][j];
64
  }
65
  output << endl;
66
  return output;
67
}
68
 
69
CMatrix& CMatrix::operator=(const CMatrix & right)
70
{
71
  if ((rows!=right.rows)||(cols!=right.cols))
72
  {
73
    cerr << "Error: assignment is not available for matrices of different sizes" << endl;
74
    return *this;
75
  }
76
  for (unsigned short i=0; i<rows; i++)
77
    for (unsigned short j=0; j<cols; j++)
78
      mptr[i][j]=right.mptr[i][j];
79
    return *this;
80
  }
81
 
82
CMatrix operator+(const CMatrix & first, const CMatrix & second)
83
{
84
  if((first.rows!=second.rows)||(first.cols!=second.cols))
85
  {
86
    cerr << "Error: addition is not available for matrices of different sizes" << endl;
87
    exit(1);
88
  }
89
  unsigned short m = first.rows;
90
  unsigned short n = first.cols;
91
  CMatrix M(m,n);
92
  for (unsigned short i=0; i<m; i++)
93
    for (unsigned short j=0; j<n; j++)
94
      M.mptr[i][j]=first.mptr[i][j]+second.mptr[i][j];
95
    return M;
96
  }
97
 
98
void CMatrix::randfill(const unsigned short range)
99
{
100
  for (unsigned short i=0; i<rows; i++)
101
    for (unsigned short j=0; j<cols; j++)
102
      mptr[i][j]=rand()%range;
103
    return;
104
  }
105
#endif


Тестирующая программа:

C++ Source Code:
1
#include "stdafx.h"
2
#include "matrix.h"
3
using std::cout;
4
 
5
void main ()
6
{
7
  matrix A(2,2);
8
  A.randfill(10);
9
  matrix B(2,2);
10
  B.randfill(10);
11
  cout << A;
12
  cout << B;
13
  matrix C(2,2);
14
  C = A+B;
15
  cout << C;
16
  return;
17
}


Собственно, стопорится на присваивании C = A+B, а именно - в месте присваивания элемента mptr[i][j]=right.mptr[i][j]. При этом нормально проходит проверку на соответствие размера. Видимо M таки из operator+ возвращается, но деструктор убивает все данные (кроме размера) заранее. Пробовал оставить деструктор пустым - всё работает. Но в таком случае, насколько я понимаю, возможна утечка памяти. Как же побороть сию проблему?

__________________
I'm on github
I'm on opendesktop.org

Отредактировано FreeSlave 20-05-2011 в 18:07

Сообщить модератору | | IP: Записан
Сообщение: 78225

Старое сообщение 20-05-2011 18:00
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



FreeSlave кой дурак придумал маллокать матрицы динамически?
все равно для разной размерности будут разные методы взаимодействия.
не надо стремиться сделать единый универсальный класс матриц, надо завести несколько отделных. Обычно требуются 3х3, 3х4, и 4х4.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 78226

Старое сообщение 20-05-2011 18:22
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Цитата:
Дядя Миша писал:
FreeSlave кой дурак придумал маллокать матрицы динамически?
все равно для разной размерности будут разные методы взаимодействия.
не надо стремиться сделать единый универсальный класс матриц, надо завести несколько отделных. Обычно требуются 3х3, 3х4, и 4х4.


И что ж теперь - десяток классов наследовать? Это же изврат.

К тому же это необязательно могут быть матрицы.

__________________
I'm on github
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 78227

Старое сообщение 20-05-2011 18:47
- За что?
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


FreeSlave не надо там ничего наследовать...

Сообщить модератору | | IP: Записан
Сообщение: 78228

Старое сообщение 20-05-2011 19:24
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FreeSlave писал:
И что ж теперь - десяток классов наследовать? Это же изврат.

изврат - это выделять 12 байт маллоком, да-да. Про фрагментацию памяти слышал?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 78234

Старое сообщение 20-05-2011 20:09
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Цитата:
Дядя Миша писал:
изврат - это выделять 12 байт маллоком, да-да. Про фрагментацию памяти слышал?


Наслышан.

Поборол проблему манипуляциями со static.

__________________
I'm on github
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 78237

Старое сообщение 20-05-2011 21:50
- За что?
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Ё-моё, только сейчас вспомнил про шаблоны с нетиповыми параметрами. Через них ведь можно заносить данные о размерах массива. Буду переделывать. А статик всё равно имел кучу минусов.

__________________
I'm on github
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 78252

Старое сообщение 21-05-2011 10:30
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



FreeSlave правильно понимаю, ты задался целью написать "самый лучший код" ? Ну, судя по категоричности твоих суждений.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 78256

Старое сообщение 21-05-2011 11:47
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


FreeSlave ты чего больше хочешь - класс матрицы реализовать или наконец-то написать шаблон с нетиповыми параметрами?

Сообщить модератору | | IP: Записан
Сообщение: 78269

Старое сообщение 21-05-2011 14:53
- За что?
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Government-Man
Вообще первое, желательно с возможностью создавать матрицы любых размеров. А уж какими средствами это будет реализовано - вопрос второстепенный, хотя и не менее важный.

Дядя Миша
Я пишу для интереса. А "самых лучших кодов" не бывает наверно.

__________________
I'm on github
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 78271

Старое сообщение 21-05-2011 15:51
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FreeSlave писал:
Вообще первое, желательно с возможностью создавать матрицы любых размеров.

зачем?

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 78279

Старое сообщение 21-05-2011 17:16
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1077

Рейтинг



Цитата:
Дядя Миша писал:
зачем?


Для универсальности. Мало ли каких размеров пригодится.

__________________
I'm on github
I'm on opendesktop.org

Сообщить модератору | | IP: Записан
Сообщение: 78284

Старое сообщение 21-05-2011 18:26
- За что?
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


FreeSlave это от программы зависит. Если ты пишешь программу для сложных научных математических рассчетов - то конечно флаг тебе в руки. Если же 3д движок - то такая сложность там совершенно излишняя и скажется на производительности что самое печальное.

Сообщить модератору | | IP: Записан
Сообщение: 78286

Старое сообщение 21-05-2011 19:10
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32213
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FreeSlave писал:
Для универсальности. Мало ли каких размеров пригодится.

никому эта универсальность не нужна.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 78287

Старое сообщение 21-05-2011 19:47
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 12:36. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Флуд > Вопрос по C++
Возвращение объекта, содержащего указатели на динамическую память
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024