Проблема с созданием 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 &'

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


person Colin Basnett    schedule 25.08.2013    source источник


Ответы (2)


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

person juanchopanza    schedule 25.08.2013
comment
Работает как шарм, спасибо. Похоже, эти штуки умнее, чем я думал! - person Colin Basnett; 26.08.2013

Смысл 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 — это конструктор копирования. Однако указатель не считается аргументом конструктора копирования.

person Dietmar Kühl    schedule 25.08.2013