无法构建shared_ptr

时间:2013-08-25 21:06:29

标签: c++ shared-ptr make-shared

我是智能指针的新手,而且我正在遇到每一个绊脚石。

我有一个结构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 &'

此错误来自何处以及如何避免错误?

2 个答案:

答案 0 :(得分:4)

std::make_shared<T>(args...)的要点是分配使用参数T构造的args...对象。这个操作背后的想法是std::shared_ptr<T>在概念上维护了两个分配的对象:

  1. 指向T类型的指针。
  2. 跟踪当前std::shared_pt<T>的数量和引用该对象的std::weak_ptr<T>个对象的数量的记录。
  3. 构造std::shared_ptr<T>时,构造函数会进行第二次分配,以构建其内部簿记的记录。 std:make_shared<T>(args...)只进行一次内存分配。

    您看到的错误是尝试使用mandala::texture_t构造mandala::texture_t*,但唯一的一个参数构造函数mandala::texture_t具有复制构造函数。但是,指针不符合复制构造函数的参数。

答案 1 :(得分:2)

您不应该将new指针传递给std::make_shared。您只需要传递可以构造texture_t的参数。