std :: swap между std :: shared_ptr <A>, где A имеет динамический массив - PullRequest
0 голосов
/ 11 марта 2019

сначала мой код:

struct A {
  A(int size);
  ~A();

  A(A&& other);
  A& operator=(const A& other);
  uint8_t* data = nullptr;
};

A::A(int size)
{
  data = new uint8_t[size];
}

A::~A()
{
  delete [] data;
  data = nullptr;
}

A::A(TPixel &&other)
{
  data = other.data;
}

A& A::operator=(const A& other)
{
  data = other.data;
}

У меня есть две переменные

std::shared_ptr<A> a = std::make_shared<A>(5);
std::shared_ptr<A> b = std::make_shared<A>(5);

Я пытался std::swap(a, b); и обнаружил ошибку в valgrind: std::enable_if<std::__and_<std::is_move_constructible<A*>, std::is_move_assignable<A*> >::value, void>::type std::swap<A*>(A*&, A*&)

Почему я получаю эту ошибку? Я реализовал операторы перемещения, и когда я тестировал std :: is_move_assignable и std :: is_move_constructible, возвращаемое значение было истинным.

1 Ответ

3 голосов
/ 11 марта 2019

обнаружена ошибка в valgrind: std::enable_if<std::__and_<std::is_move_constructible<A*>, std::is_move_assignable<A*> >::value, void>::type std::swap<A*>(A*&, A*&)

Почему я получаю эту ошибку?

То, что вы показываете, не является ошибкой.Это объявление функции.

Я реализовал операторы перемещения

Вы не реализовали оператор присваивания перемещения.


PS

  • Вы не определили конструктор перемещения.
    • Вы определили конструктор, который не объявили: A::A(TPixel &&).Это может быть связано.
  • Оператор присваивания копии
    • приводит к утечке памяти.
    • оставляет оба объекта указанными на один и тот же массив.
  • Деструктор имеет неопределенное поведение, если объект был назначен для копирования, а копия уже уничтожена.
...