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;
}
解决方案
这个问题有点不明确,但确实开辟了一些可能性。
首先,你需要决定这些事情:
- 你想存储一个数组还是一个指针?
- 目前您正在存储一个指针,尽管它可能指向一个数组。
- 你想返回一个数组,还是一个指向它的第一个元素的指针?
- 你不能返回一个数组
- 在这种情况下,您可以返回一个指针(它不是 UB,但
getBufferValue
需要返回 aunsigned char*
才能编译),但是您想要吗?
如果可以更改的边界SkinnyBuffer
,则存储指向某些动态分配的内存的指针是合适的。你应该使用 astd::vector
来达到这个目的,尽管你声称访问向量并不慢——你一定是不小心把它复制到了某个地方或者做了一些其他低效的事情。所以你可以进一步探索。
至于返回值,这又取决于你想要什么。operator[]
实现提供对缓冲区的类似元素的访问可能更合乎逻辑。但是,那么,为什么要包装向量呢?只要有一个向量!
如果您确实想返回一个指针,您将无法将其分配给数组类型的对象(尽管罗伯特的回答声称);您必须使用std::copy
(或相关技术)一次复制一个元素。这是从 C 继承的限制,它不允许直接数组分配。另请注意,返回的指针将是“弱”的,但也没有向在调用站点编写代码的程序员清楚地描述这一点,这是危险的;智能指针会使这更好。
最后,您问题的核心是这也适用于setBufferValue
。你对类的输入只是复制一个指针,谁知道它指向什么?同样,向量将使您的生活更轻松。
最终,这里有很多选择,“正确”的选择取决于您的实际需求以及您希望如何处理这些数据。
推荐阅读
- r - 如何仅从某些列在 R 中创建分组条形图?
- excel - 为什么我的 Range 变量出现 Object Required 错误
- c# - 实体框架查询 - 仅选择记录,直到另一个表中的时间戳
- python - Flask - 反序列化 JSON 并加载到 Postgres DB
- python - 单击输入后Python3不接受我的键盘输入
- spring - Spring Boot 2.3 + GraalVM 解析配置时遇到错误
- c# - C# 在 UI 线程中等待
- node.js - 为什么我收到“错误:没有密钥集 vapidDetails.publicKey”?
- binding - 有没有办法在 SwiftUI 中的特定索引处的枚举中创建计算数组属性的绑定?
- java - 在 * 上运行 Tomcat:
而不是本地主机: