代码之家  ›  专栏  ›  技术社区  ›  Felipe

返回函数中的无符号字符数组而不是指针

c++
  •  0
  • Felipe  · 技术社区  · 7 年前

    我正在实现C++中的一个简单的类,它只有一个属性必须是 unsigned char array 两种方法,一种是get,一种是set。我正在努力定义这个无符号字符数组。我将属性定义为指针,但get方法无法返回指针,因为这是未定义的行为。那我该还什么呢?地址呢?如果我使用 &

    如何实现这个类不返回指向本地无符号字符数组的指针?

    ps:我没有用 std::vector<unsigned char> 或者其他类型,因为返回值的时间增加了10倍。用char数组我得到了0.005毫秒 标准::向量<无符号字符>

    class SkinnyBuffer {
    private:
        unsigned char* _value;
    public:
        ~SkinnyBuffer();
        SkinnyBuffer();
        void setBufferValue(unsigned char value[]);
        unsigned char& getBufferValue();;
    };
    
    #include "utils/SkinnyBuffer.h"
    
    SkinnyBuffer::~SkinnyBuffer() {
    }
    SkinnyBuffer::SkinnyBuffer() {
    }
    void SkinnyBuffer::setBufferValue(unsigned char value[]) {
        _value = value;
    }
    unsigned char SkinnyBuffer::getBufferValue() {
        return _value;
    }
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   user3477273 user3477273    7 年前

    这是一个更合理的方法。虽然,这也不好。您应该实现构造函数和析构函数。方法是返回一个指针。不能返回整个数组。尽管您应该为数组的大小保留一个额外的字段。

    class SkinnyBuffer {
    private:
        unsigned char* _value;
    public:
        ~SkinnyBuffer();
        SkinnyBuffer();
        void setBufferValue(unsigned char value[], size_t n);
        unsigned char* getBufferValue();
    };
    
    // imagine this is the cpp file down here
    
    void SkinnyBuffer::setBufferValue(unsigned char value[], size_t n) {
        if(_value != nullptr)
          delete [] _value;
        _size = n; // assume _size is a field
        _value = new unsigned char[_size];
        std::copy(value, value + n, _value);
    }
    
    unsigned char* SkinnyBuffer::getBufferValue() {
        return _value;
    }
    
        2
  •  3
  •   Lightness Races in Orbit    7 年前

    这个问题有点不明确,但确实有一些可能性。

    • 要存储数组还是指针?
    • 要返回数组还是返回指向其第一个元素的指针?
      • getBufferValue unsigned char* 但是你想吗?

    SkinnyBuffer 如果可以更改,则存储指向某个动态分配内存的指针是合适的。你应该改用 std::vector

    至于返回值,这取决于你想要什么。实现一个 operator[] 它提供了对缓冲区的类似元素的访问。但是,那么,为什么要包装向量呢?只要有一个向量!

    std::copy (或相关技术)一次复制一个元素。这是从C继承的限制,不允许直接数组赋值。还要注意的是,返回的指针将是“弱”的,但也不能清楚地向程序员描述这一点,在调用站点编写代码,这是危险的;一个聪明的指针会让这更好。

    setBufferValue ,也是。你对类的输入只是复制一个指针,谁知道它指向什么?同样,矢量会让你的生活更轻松。

    最终,这里有很多选择,而“正确”的选择取决于您的实际需求以及您希望如何处理这些数据。

        3
  •  0
  •   Shadi Naif    7 年前

    首先,你的 setBufferValue 将设置 _value 指向所传递数组的相同地址。它不会复制它,所以小心处理它

    getBufferValue ,必须声明为:

    unsigned char * getBufferValue();
    

    unsigned char * SkinnyBuffer::getBufferValue() {