将unique_ptr用于浮点数组

时间:2014-03-28 07:47:12

标签: c++ arrays

我写了一个文件IO库。一个函数File::read看起来像这样:

template <typename T>
void File::read(T * t, unsigned long count) const

它将count T读入*t

现在,跳到客户端。我分配了一个我想读入的内存缓冲区。我写了这篇文章并且效果很好:

float * buffer = new float [16];
file->read(buffer, 16);

然而,这并非例外安全。所以我决定将缓冲区包装在std::unique_ptr中。在这里的某个地方,我犯了一个错误。

std::unique_ptr<float[]> buffer (new float[16]);
file->read(*buffer , 16);

这会在file-&gt; read:

上产生以下错误
  

'operator *'不匹配(操作数类型为'std :: unique_ptr')

我认为通过解除引用unique_ptr,我会得到一个指向float[]数组的第一个元素的指针。我的错误在哪里,修复是什么?

1 个答案:

答案 0 :(得分:5)

你有几个问题:首先是你std::unique_ptr float[](即你有一个指向float数组的指针。)

另一个问题是智能指针就像普通指针一样。当您使用*运算符取消引用普通指针时,您不再有指针而是一个值(指针指向的值)。


另外,我建议您使用std::array(如果您知道编译时的大小)或std::vector而不是智能指针。在现代C ++中,几乎不需要指针。

您可以像

一样使用它
std::array<float, 16> buffer;
file->read(buffer.data(), buffer.size());

如果您没有std::array,则可以使用std::vector代替:

std::vector<float> buffer(16);  // Create a vector of 16 floats,
                                // default initialized (i.e. 0.0)

// &buffer[0] is a pointer to the first element in the vector
// all vectors are guaranteed to be contiguous like normal arrays
file->read(&buffer[0], buffer.size());