![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
кстати, можно просто
Это сообщение отредактировал(а) baldina - 25.9.2013, 20:23 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
baldina, нельзя, он у тебя просто буфер скопирует побитово и, в результате, будет утечка.
Да и std::move в твоём ответе лишние(избыточные) явно. Это сообщение отредактировал(а) vinter - 25.9.2013, 20:24 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
тут посмотри http://en.cppreference.com/w/cpp/language/move_constructor
Добавлено через 44 секунды vinter, он побитово скопирует указатель. где утечка? |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
предыдущий указатель не удалится. А новый, кстати, будет удалён xvalue(тот с которого переместили внутренности) объектом. Так что не просто утечка, а утечка с невалидным указателем в новом объекте. Первый твой ответ был правильным.
Добавлено через 5 минут и 31 секунду Про утечку я неправильно сказал, это же конструктор. Но вопрос с невалидным указателем остается. Это сообщение отредактировал(а) vinter - 25.9.2013, 20:30 |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Всем большое спасибо. Пойду еще статью прочитаю, чтобы точно все понять =)) А пока понял, что не нужно применять что бы просто применить (пусть и очень хочется =)) То есть использование достаточно специфическое, и в повседневном коде можно обойтись стандартными инструментами.
|
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
А так не пробовал?
Добавлено @ 20:44 Да можно применять. Если с CString прокатит, конечно. Это сообщение отредактировал(а) akizelokro - 25.9.2013, 20:52 -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| xTr1m |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 692 Регистрация: 9.2.2005 Где: Москва Репутация: 1 Всего: 1 |
Сейчас попробовал. По времени также, как если бы без константной ссылки
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
почему он невалидный? если не использовать явный перенос (т.е. конструктор применяется только к временным объектам), то все в порядке http://ideone.com/DkFQbw если использовать явный перенос, надо предотвратить повторное освобождение памяти в деструкторе http://ideone.com/D4m7KI ты об этом? |
|||
|
||||
| akizelokro |
|
||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Да не должно меняться при присваивании константной ссылке. В этом случае эффект, что время жизни созданного временного обьекта будет равно времени жизни константной ссылки. Кажись, единственный эффект. Если не жаль времени, то попробуй такой вариант
Это сообщение отредактировал(а) akizelokro - 25.9.2013, 21:29 -------------------- a = a + b; b = a - b; a = a - b; |
||||
|
|||||
| vinter |
|
||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
baldina,
Там не всё в порядке. Ты в этом коде так и не вызвал конструктор перемещения. Добавь в тот код еще одну строчку(String c(std::move(a));) и ты увидишь, что указатель удалится 2 раза. Что уже является UB. Но в общем случае до второго удаления есть еще пользование этим объектом, у которого, на деле, указатель уже невалиден. Мне кажется ты не совсем понимаешь всю это чехарду с перемещением. std::move и конструктор перемещения никогда и ничего не перемещают, если только ты не делаешь этого явно. Чем, по сути, отличается конструктор копирования от конструктора перемещения по умолчанию? первый делает a = rhs.a, а второй a = std::move(rhs.a);. Для композитных объектов класса у которых нет конструктора перемещения поведение обоих конструкторов по умолчанию идентично. Т.е. в твоём случае это наличие двух объектов, которые ссылаются на один буфер, что есть заезженная проблема из старого доброго C++ к которой прибегают всегда, когда объясняют зачем писать пользовательский конструктор копирования. Замени char* на std::string и всё будет работать с конструктором перемещения по умолчанию, т.к. std::string "знает" как работать с перемещением. Твой второй пример есть пример правильного написания конструктора перемещения. Добавлено через 3 минуты и 34 секунды akizelokro, так писать нельзя, ты возвращаешь ссылку на объект, которого больше нет. Должно быть так:
В этом случае время жизни временного объекта продлевается на всё время жизни константной ссылки. Это справедливо только для константных ссылок. |
||||
|
|||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
vinter, так я об этом и написал, только букф поменьше...
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Да нет же. Твой код с String (String&&) = default; неверен. И я объяснил почему.
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |