在函数中返回无符号字符数组,但不返回指针

时间:2018-10-10 09:19:00

标签: c++

我正在C ++中实现一个简单的类,该类仅具有一个必须为unsigned char array的属性和两个方法,一个为get和一个为set。我正在努力定义此无符号字符数组。我将属性定义为指针,但是get方法无法返回指针,因为这是未定义的行为。那我应该退货吗?和地址?如果我使用&,则该类无法编译。

如何实现此类而不返回指向本地“无符号字符数组”的指针?

ps:我没有使用std::vector<unsigned char>或其他类型,因为它会增加10次返回值的时间。使用char数组,我得到0.005毫秒,使用std::vector<unsigned char>时,我得到0.07毫秒。

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 个答案:

答案 0 :(得分:3)

这个问题虽然没有明确说明,但确实提供了一些可能性。

首先,您需要决定以下事情:

  • 您要存储数组还是指针?
    • 当前您正在存储一个指针,尽管它可能指向一个数组。
  • 是否要返回数组或指向其第一个元素的指针?
    • 您无法返回数组
    • 在这种情况下,您可以返回一个指针(它不是UB,但是getBufferValue需要返回unsigned char*才能进行编译),但是您是否想要去?

如果SkinnyBuffer的边界可以更改,则存储指向一些动态分配的内存的指针是适当的。为此,您应该使用std::vector,并且尽管有要求,访问向量也不会较慢-您必须不小心将其复制到了某个地方或做了其他无效的事情。因此,您可以进一步探索。

关于返回值,同样,这取决于您想要什么。实现operator[]可能更合乎逻辑,该std::copy提供对缓冲区的类似元素的访问。但是,为什么还要包装向量呢?只需一个向量!

如果您确实想返回一个指针,则无法将其分配给数组类型的对象(尽管罗伯特的回答声称);您必须使用setBufferValue(或相关技术)一次复制一个元素。这是从C继承的限制,不允许直接分配数组。还应注意,返回的指针将是“弱”的,但也不能向程序员在调用站点处编写代码的情况下清楚地描述这一点,这很危险;一个智能指针会使它变得更好。

最后,问题的核心是这一切也都适用于Microsoft.SharePoint.Client.dll。您在类中的输入仅复制了一个指针,谁知道该指向什么?同样,向量将使您的生活更加轻松。

最终,这里有很多选择,“正确”的选择取决于您的实际需求以及您对这些数据的处理方式。

答案 1 :(得分:1)

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

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 :(得分:0)

首先,您的setBufferValue_value设置为指向所传递数组的相同地址。它不会复制它,因此请小心处理

现在,对于getBufferValue,必须将其声明为:

unsigned char * getBufferValue();

unsigned char * SkinnyBuffer::getBufferValue() {