如何 return/copy unique_ptr<unsigned char[]> 的值?

How to return/copy values of an unique_ptr<unsigned char[]>?

我有一个简单的 class,在 C++ 中只有一个属性 std::unique_ptr<unsigned char[]>。我想要一个将字符串转换为 std::unique_ptr<unsigned char[]> 的函数,另一个将 float 转换为 std::unique_ptr<unsigned char[]>,第三个函数将属性 std::unique_ptr<unsigned char[]> 转换为 return。我的 header 正在编译,但源 CPP 没有。即使是 return 属性也没有编译。

#include <memory>
class SkinnyBuffer {
private:
    std::unique_ptr<unsigned char[]> _buff;
public:
    ~SkinnyBuffer();
    SkinnyBuffer();
    void setBuffValue(float f);
    void setBuffValue(std::string str);
    std::unique_ptr<unsigned char[]>* getBuffValue();
};

#include "utils/SkinnyBuffer.h"
SkinnyBuffer::~SkinnyBuffer() { }
SkinnyBuffer::SkinnyBuffer() { }
void SkinnyBuffer::setBuffValue(float f) {
    // How to implement it
    _buff = f;
}
void SkinnyBuffer::setBuffValue(std::string str) {
    _buff = std::unique_ptr<unsigned char[]>(str.data(), str.data() + str.length());
}
std::unique_ptr<unsigned char[]>* SkinnyBuffer::getBuffValue() {
    return &_buff;
}

你不能这样做。您必须将字符串的内容复制到由唯一指针指向的新数组中,然后 return 唯一指针。

另一种选择是return一个字符串中你的两个继承类。

std::unique_ptr 是不可复制的对象。如果您需要对其进行只读访问,您有两个(主要)选项:

  1. Return 对 unique_ptr 本身的引用:

    const std::unique_ptr<unsigned char[]>& getBuffValue() const
    {
        return _buff;
    }
    
  2. Return 指向托管数组的 const 指针:

    const unsigned char* getBuffValue() const
    {
        return _buff.get();
    }
    

要将字符串分配给缓冲区,您可以这样做:

void setBuffValue(const std::string& str)
{
    _buff = std::make_unique<unsigned char []>(str.length() + 1);
    std::copy_n(str.c_str(), str.length() + 1, _buff.get());
}

请注意,您必须将终止空字符复制到您的缓冲区。否则它对外界几乎没有用,因为它的长度不会被用户知道。

但是你真的需要std::unique_ptr<unsigned char[]>吗? std::vector 在这里似乎更合适。

Return查看buff_中的数据,请勿尝试复制。

const unsigned char * SkinnyBuffer::getBuffValue() const {
    return _buff.get();
}

您可以使用该值,直到 SkinnyBuffer 被销毁或修改。