Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> c++ x11 и rvalue reference 
V
    Опции темы
baldina
Дата 25.9.2013, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



кстати, можно просто
Код

String (String&& other) = default;



Это сообщение отредактировал(а) baldina - 25.9.2013, 20:23
PM MAIL   Вверх
vinter
Дата 25.9.2013, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



baldina, нельзя, он у тебя просто буфер скопирует побитово и, в результате, будет утечка.
Да и std::move в твоём ответе лишние(избыточные) явно.

Это сообщение отредактировал(а) vinter - 25.9.2013, 20:24


--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 25.9.2013, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



тут посмотри http://en.cppreference.com/w/cpp/language/move_constructor

Добавлено через 44 секунды
vinter, он побитово скопирует указатель. где утечка?
PM MAIL   Вверх
vinter
Дата 25.9.2013, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



предыдущий указатель не удалится. А новый, кстати, будет удалён xvalue(тот с которого переместили внутренности) объектом. Так что не просто утечка, а утечка с невалидным указателем в новом объекте. Первый твой ответ был правильным.

Добавлено через 5 минут и 31 секунду
Про утечку я неправильно сказал, это же конструктор. Но вопрос с невалидным указателем остается.

Это сообщение отредактировал(а) vinter - 25.9.2013, 20:30


--------------------
Мой блог
PM MAIL WWW   Вверх
xTr1m
Дата 25.9.2013, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Всем большое спасибо. Пойду еще статью прочитаю, чтобы точно все понять =)) А пока понял, что не нужно применять что бы просто применить (пусть и очень хочется =)) То есть использование достаточно специфическое, и в повседневном коде можно обойтись стандартными инструментами. 
PM MAIL WWW ICQ   Вверх
akizelokro
Дата 25.9.2013, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(xTr1m @  25.9.2013,  17:44 Найти цитируемый пост)
 Пробовал так

А так не пробовал?

Код

const CString & cs = GetText();


Добавлено @ 20:44
Да можно применять.  Если с CString прокатит, конечно.

Это сообщение отредактировал(а) akizelokro - 25.9.2013, 20:52


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
xTr1m
Дата 25.9.2013, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: 1
Всего: 1



Сейчас попробовал. По времени также, как если бы без константной ссылки
PM MAIL WWW ICQ   Вверх
baldina
Дата 25.9.2013, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(vinter @  25.9.2013,  20:26 Найти цитируемый пост)
вопрос с невалидным указателем остается

почему он невалидный?
если не использовать явный перенос (т.е. конструктор применяется только к временным объектам), то все в порядке
http://ideone.com/DkFQbw

если использовать явный перенос, надо предотвратить повторное освобождение памяти в деструкторе
http://ideone.com/D4m7KI
ты об этом?
PM MAIL   Вверх
akizelokro
Дата 25.9.2013, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(xTr1m @  25.9.2013,  20:46 Найти цитируемый пост)
Сейчас попробовал. По времени также, как если бы без константной ссылки 


Да не должно меняться при присваивании константной ссылке. В этом случае эффект, что время жизни созданного временного обьекта будет равно времени жизни константной ссылки. Кажись, единственный эффект.
Если не жаль времени, то попробуй такой вариант

Код

string& GetText()
{
  return (string("rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"));
}

const string & cs = GetText();




Это сообщение отредактировал(а) akizelokro - 25.9.2013, 21:29


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
vinter
Дата 26.9.2013, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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, так писать нельзя, ты возвращаешь ссылку на объект, которого больше нет.
Должно быть так:
Код

string GetText()
{
  return (string("rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr"));
}
const string & cs = GetText();

В этом случае время жизни временного объекта продлевается на всё время жизни константной ссылки. Это справедливо только для константных ссылок.


--------------------
Мой блог
PM MAIL WWW   Вверх
baldina
Дата 26.9.2013, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



vinter, так я об этом и написал, только букф поменьше...
PM MAIL   Вверх
vinter
Дата 26.9.2013, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Да нет же. Твой код с String (String&&) = default; неверен. И я объяснил почему.


--------------------
Мой блог
PM MAIL WWW   Вверх
azesmcar
Дата 26.9.2013, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(vinter @  25.9.2013,  18:25 Найти цитируемый пост)
azesmcar, убери && после C. Твой код конструктор перемещения не вызывает, а лишь создаёт rvalue ссылку. 

ага, спасибо.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.