gpt4 book ai didi

c++ - 在 vector 中存储二进制数据

转载 作者:行者123 更新时间:2023-11-28 06:04:59 26 4
gpt4 key购买 nike

我有给定的类:

class Buffer
{
public:
Buffer(int capacity);
~Buffer();

int size, capacity, client;
int write(const char *data, int bytes);
int read(char *data, int bytes);
char *data_;
private:
int beg_index_, end_index_, size_, capacity_;

};

Buffer::Buffer(int capacity) {
beg_index_ = 0;
end_index_ = 0;
size_ = 0;
capacity_ = capacity;
data_ = new char[capacity];
}

Buffer::~Buffer()
{
delete[] data_;
}

int Buffer::write(const char *data, int bytes)
{
if (bytes == 0) return 0;

int capacity = capacity_;
int bytes_to_write = std::min(bytes, capacity - size_);
if (bytes_to_write <= capacity - end_index_)
{

memcpy(data_ + end_index_, data, bytes_to_write); //**ERROR
end_index_ += bytes_to_write;
if (end_index_ == capacity) end_index_ = 0;
}
//(...)

我想将二进制数据存储在一个 vector 中,如下所示:

std::vector<Buffer> buffers_audio(2,Buffer(1000000));

void buffering_mem(char* chunk,int size_chunk, int close_file, int client, int total_size){
buffers_audio[client].write(chunk, size_chunk);
}

buffering_mem 是一个从 NodeJS 调用的函数,应该单独存储来自几个客户端的信息(有时,该函数从客户端 1 调用,有时从客户端 20 调用)。但我在 memcpy 中收到错误“未处理的异常...访问冲突写入位置”。而且我不愿意复制二进制数据。任何人都可以解释为什么我会收到此错误?

最佳答案

当这段代码被执行时:

 std::vector<Buffer> buffers_audio(2,Buffer(1000000));

发生以下情况:

Buffer.ctor(int); //creates a default value on stack   
Buffer.ctor(const &Buffer) // initialize element #1
Buffer.ctor(const &Buffer) // initialize element #2
Buffer.dtor(); // Destroy the temp instance.

默认复制构造函数复制所有缓冲区的字段包括 data_ 指针值。但是,它不会克隆引用的数据。结果是 3 个对象实例指向同一内存,这很可能不是预期的。

要修复它,可以编写一个适当的复制构造函数。一个更简单的解决方案是使用 vector 来管理数据。此外,为了减少对象实例化的数量,请使用 emplace_back()

class Buffer
{
public:
explicit Buffer(int capacity): data(capacity){ };
char* data() {return data_.data();}
private:
std::vector<char> data_;
...
};


std::vector<Buffer> buffers_audio();

buffers.emplace_back(100000); // call Buffer(int) in-place
buffers.emplace_back(100000);

关于c++ - 在 vector 中存储二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com