Модераторы: JackYF, bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функции управления перемещением 
:(
    Опции темы
Aoizora
Дата 9.4.2017, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть такой простой класс строки:

Код

#include <iostream>
#include <cstring>

class String
{
public:
    String() : buffer(nullptr), length(0) {}
    String(const char *pStr);
    ~String();
    String(const String&);
    String(String&&);
    String& operator=(const String&);
    String& operator=(String&&);
    size_t size() { return length; }

private:
    char *buffer;
    size_t length;

    void free();
    void alloc_and_copy(const char *);
};

String::String(const char *pStr)
{
    alloc_and_copy(pStr);
}

String::~String()
{
    free();
}

String::String(const String& rhs)
{
    alloc_and_copy(rhs.buffer);
    std::cout << "Copy constructor" << std::endl;
}

String::String(String&& str)
{
    buffer = str.buffer;
    length = str.length;

    str.buffer = nullptr;
    str.length = 0;

    std::cout << "Move constructor" << std::endl;
}

String& String::operator=(const String& rhs)
{
    if (this != &rhs)
    {
        free();
        alloc_and_copy(rhs.buffer);
    }
    std::cout << "Assignment operator" << std::endl;
    return *this;
}

String& String::operator=(String&& rhs)
{
    if (this != &rhs)
    {
        buffer = rhs.buffer;
        length = rhs.length;

        rhs.buffer = nullptr;
        rhs.length = 0;
    }
    std::cout << "Move assignment operator" << std::endl;
    return *this;
}

void String::free()
{
    if (buffer)
        delete[] buffer;
}

void String::alloc_and_copy(const char *pStr)
{
    size_t len = std::strlen(pStr);
    char *data = new char[len + 1];

    std::copy(pStr, pStr + len, data);
    data[len] = 0;

    length = len;
    buffer = data;
}

int main()
{
    String a("xxx");
    String b(a);
    //b = std::move(a);
    b = a;
}


Некоторые вещи вызвали у меня недопонимание.

1. Класс я писал не полностью самостоятельно, а глядя на код из статьи, поэтому доверился чьему-то авторитету. Первое недопонимание вызвало то, что в конструкторе перемещения и в операторе присвоения при перемещении не освобождается память объекта, содержимое которого заменяется. Почему? Разве не будет утечки во всех функциях, связанных с rvalue-ссылками?

2. Почему при подборе функции во время выполнения b = a; вызывается не оператор присваивания при перемещении, а копирующий оператор присваивания?

3. И еще. Правильно ли я понимаю, что вся эта move-семантика создана только ради того, чтобы в зависимости от типа аргумента l- или r-value могли вызываться перегруженные функции для r-значений, в которых реализовано перемещение? Это попросту синтаксический сахар над перегрузкой функций?

Это сообщение отредактировал(а) Aoizora - 9.4.2017, 18:22
PM MAIL   Вверх
volatile
Дата 9.4.2017, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Aoizora @  9.4.2017,  14:30 Найти цитируемый пост)
в конструкторе перемещения и в операторе присвоения при перемещении не освобождается память объекта

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

Цитата(Aoizora @  9.4.2017,  14:30 Найти цитируемый пост)
2. Почему при подборе функции во время выполнения b = a; вызывается не оператор присваивания при перемещении, а копирующий оператор присваивания?

ну так и должно быть, это же копирование объекта. Объект "a" никуда не исчезает.

Цитата(Aoizora @  9.4.2017,  14:30 Найти цитируемый пост)
Правильно ли я понимаю, что вся эта move-семантика создана только ради того

Это создано для повышения производительности. Классический оператор копирования может очень дорого стоить, перемещение - гораздо дешевле. (вместо всего объема памяти, копируется только указатель.)



Это сообщение отредактировал(а) volatile - 9.4.2017, 22:41
PM MAIL   Вверх
Google
  Дата 22.1.2020, 06:06 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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