Проблемы с построением shared_ptr

Я новичок в умных указателях, и я в процессе удара по каждому камню преткновения.

У меня есть структура texture_t:

struct texture_t
{
hash32_t hash;
uint32_t width;
uint32_t height;
uint32_t handle;
};

Когда я пытаюсь сделать shared_ptr этой структуры, используя эту строку:

auto texture_shared_ptr = std::make_shared<texture_t>(new texture_t());

Я получаю эту ошибку:

error C2664: 'mandala::texture_t::texture_t(const mandala::texture_t &)' : cannot convert parameter 1 from 'mandala::texture_t *' to 'const mandala::texture_t &'

Откуда эта ошибка и как ее избежать?

1

Решение

Вы не должны проходить newуказатель на std::make_shared. Вам просто нужно передать аргументы, из которых texture_t может быть построен к нему.

2

Другие решения

Точка std::make_shared<T>(args...) это выделить T объект, построенный с параметрами args..., Идея этой операции заключается в том, что std::shared_ptr<T> концептуально поддерживает два выделенных объекта:

  1. Указатель на тип T,
  2. Запись, отслеживающая номер текущего std::shared_pt<T> и количество std::weak_ptr<T> объекты, ссылающиеся на объект.

При построении std::shared_ptr<T> конструктор выполняет второе выделение, чтобы создать запись для своего внутреннего учета. std:make_shared<T>(args...) делает только одно выделение памяти.

Ошибка, которую вы увидели, является результатом попытки создать mandala::texture_t используя mandala::texture_t* но единственный аргумент конструктор mandala::texture_t has является конструктором копирования. Однако указатель не квалифицируется как аргумент конструктора копирования.

4

По вопросам рекламы [email protected]