![]() |
|
Модераторы: bsa |
![]()
|
|
| ller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Если в методе умножения выделю память разыменую и верну, то объект сам не уничтожется в последствии. Будем считать что существует копирующий конструктор и оператор присваивания правильные, с учетом указателей, чтоб не загромождать код тут |
|||
|
||||
| ISergeyN |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 11.10.2008 Где: Україна Репутация: 2 Всего: 2 |
Я предложил бы так сделать
Это сообщение отредактировал(а) ISergeyN - 14.7.2009, 22:25 |
||||
|
|||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
оператор "Matrix & operator *(const Matrix & m1,const Matrix &m2)" возвращает ссылку на объект класса "Matrix", какую память ты собрался выделять, разыменовывать? -------------------- |
|||
|
||||
| ller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Gordon,
Что то типа того
Но это утечки памяти |
|||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
А зачем тебе создавать объект динамически? Чем тябя так: "Matrix result(m2.x,m1.y);", не устраивает?
p.s. да и память еще нужно будет освободить, а указатель теряется в твоем случае... Это сообщение отредактировал(а) Gordon - 14.7.2009, 22:30 -------------------- |
|||
|
||||
| ller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Устраивает, просто на автомате поставил ссылку. А нужно по значению....
Добавлено через 1 минуту и 1 секунду
Зря я это сделал Добавлено через 2 минуты и 20 секунд ISergeyN, Спасибо за совет, это тоже вариант. |
|||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
По значению? Это еще зачем? Лишнии копии создаваться будут!
Это сообщение отредактировал(а) Gordon - 14.7.2009, 22:40 -------------------- |
|||
|
||||
| ller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Это почему? Деструктор должен будет все подчистить.
Или я не прав? Добавлено через 2 минуты и 48 секунд Локальный объект выдет из области видимости и вызовится деструктор, который подчистит память, а копия вернется. Только нужно будет написать копирующий конструктор, который будет копировать содержимое массива. А не просто указатель как по умолчанию |
|||
|
||||
| Gordon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Подчистит! (если написать его правильно) елси писать так:
то деструктор "вызовется сам", когда переменная выйдет из области видимости. А если создавать объект динамически:
то нужно еще и освободить память самому!
тогда будет вызван деструктор, а потом освобождена память! Только зачем нужны лишнии копии? Это затраты на вызов конструктора. Это сообщение отредактировал(а) Gordon - 14.7.2009, 22:59 -------------------- |
||||||
|
|||||||
| ller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Вот и я о чем.
Нужно делать так. А вот если деструктор не чистит, то будут утечки. Но это выходит за рамки этой темы У меня вроде чистит все. |
|||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Ну это хорошо что чистит! Только я не пойму, зачем нужно по значению передавать? (ну просто интересно p.s. Можно как ISergeyN предложил, только сделать через шаблоны, чтобы задавать размер матрицы самому...
так и с динамическим выделением памяти париться не нужно -------------------- |
|||
|
||||
| ller |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
С одной стороны да, но к примеру, как я узнаю размерность результата
m3=m1*m2.... Вернее я то его знаю, но отслеживать его будет очень неудобно... Нужно помнить какой размерности m1 и m2. И потом так получается интереснее учиться |
|||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Ну Вам виднее...
Еще недостатоки примера с шаблоном в том, что увеличивается размер объекта класса матрицы, т.к. он содержит массив а не указатель и "TMatrix<int, 4, 4>" и "TMatrix<int, 4, 3>" вроде как разные типы, что может помешать, ИМХО... Это сообщение отредактировал(а) Gordon - 14.7.2009, 23:35 -------------------- |
|||
|
||||
| ller |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
Не передавать а возвращать. Если возвращать указатель, то нужно под объект создавать память и потом ее самому чистить, если возвращать по значению, то с объектом можно работать как с переменной, вышел объект из области видимости вызвался деструктор.
Как тут создается временный объект (m1*m2) и он после копирования удаляется. Через указатели код будет путаней
Это сообщение отредактировал(а) ller - 14.7.2009, 23:40 |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Возвращать нужно по значению (не по ссылке). А что бы это не привело к многочисленным созданиям и удалениям объектов, класс нужно разделить на 2: собственно сама реализация (она будет скрыта от пользователя), и класс - представитель, которые будет содержать smart pointer (например boost::shared_ptr) на реализацию. Объекты этого класса можно будет свободно порождать, копировать и удалять в любом количестве, и это не приведет к массовым манипуляциям с заказами/удалениями массивов (как в оригинальном варианте)
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |