c++ - 在函数中返回 unsigned char 数组而不是指针

标签 c++

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

何实现此类不返回指向本地“unsigned char 数组”的指针?

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;
}

最佳答案

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

首先,你需要决定这些事情:

  • 你想存储一个数组,还是一个指针?
    • 目前您正在存储一个指针,尽管它可能指向一个数组。
  • 你想返回一个数组,还是指向它第一个元素的指针?
    • 不能返回数组
    • 在这种情况下,您可以返回一个指针(它不是 UB,但 getBufferValue 需要返回一个 unsigned char* 才能执行此操作编译),但你想要吗?

如果 SkinnyBuffer 的边界可以改变,那么存储一个指向一些动态分配内存的指针是合适的。为此,您应该改为使用 std::vector,并且尽管您声称访问 vector 并不慢 — 您一定是不小心将它复制到某处或做了其他一些低效的事情。所以您可以进一步探索。

至于返回值,这又取决于您想要什么。实现一个提供对缓冲区的类元素访问的 operator[] 可能更符合逻辑。但是,那么,为什么要包装 vector 呢?只要有一个 vector !

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

最后,您问题的核心是这也适用于 setBufferValue。您对类的输入只是复制一个指针,谁知道它指向什么?同样, vector 将使您的生活更加轻松。

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

关于c++ - 在函数中返回 unsigned char 数组而不是指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52736763/

相关文章:

c++ - 堆栈展开对析构函数的调用

c++ - 模板类可以有纯虚函数和虚运算符吗?

c++ - 使用计算着色器的错误结果

c++ - 对 vtable 的 undefined reference

c++ - 无法使用 GDB 进入共享库中的函数

c++ - swig:使 C++ 对象可在 perl 中打印?

c++ - main : linking fortran with C++的多重定义

c++ - 用户定义的函数和声明变量有什么区别? C++

C++:从对象指针 vector 中删除元素而不删除它指向的对象的正确方法是什么?

C++ CppUnit 测试 (CPPUNIT_ASSERT)