我是智能指针的新手,而且我正在遇到每一个绊脚石。
我有一个结构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 &'
此错误来自何处以及如何避免错误?
答案 0 :(得分:4)
std::make_shared<T>(args...)
的要点是分配使用参数T
构造的args...
对象。这个操作背后的想法是std::shared_ptr<T>
在概念上维护了两个分配的对象:
T
类型的指针。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
具有复制构造函数。但是,指针不符合复制构造函数的参数。
答案 1 :(得分:2)
您不应该将new
指针传递给std::make_shared
。您只需要传递可以构造texture_t
的参数。