我写了一个文件 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);
这会在文件->读取时产生以下错误:
no match for 'operator*' (operand type is 'std::unique_ptr')
我认为通过取消对 unique_ptr
的引用,我会得到一个指向 float[]
数组第一个元素的指针。我的错误在哪里,解决方法是什么?
最佳答案
你有几个问题:第一个是你制作了一个 float[]
的 std::unique_ptr
(即你有一个指向 数组的指针> 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());
关于c++ - 对 float 组使用 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22706997/