1

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

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

这个错误来自哪里,我该如何避免它?

4

2 回答 2

4

的重点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使用 a构造 a 而导致的,mandala::texture_t*但构造函数唯一的一个参数mandala::texture_t是复制构造函数。但是,指针不符合复制构造函数的参数。

于 2013-08-25T21:13:57.413 回答
2

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

于 2013-08-25T21:07:57.853 回答