我无法理解如何使用boost中的循环缓冲区。基本上我试图在不使用指针的情况下将对象存储在缓冲区中。所以没有new
或其他任何东西。我想这样做的原因是因为程序必须处理连续的数据流,我需要在内存中保留一定的数量。没有循环缓冲区的一种方法是为连续数据分配和 deallocate 内存,我认为这是不必要的,因为我也可以改变已经存在的对象。
我已经写下了我的问题的基本示例,我尝试将对象Item
存储在缓冲区中:
#include <iostream>
#include <boost/circular_buffer.hpp>
// Some object to be stored in buffer
class Item{
private:
int* data = NULL;
public:
// Constructor
Item(int i){
data = new int;
(*data) = i;
}
// Destructor
~Item(){
if (data!=NULL){
delete data;
data = NULL;
}
}
// Prints int stored in data
void print(){
std::cout << "data: "<< *data << std::endl;
}
};
// The circular buffer
boost::circular_buffer<Item> cb(3);
// Function for adding a new item to the buffer
Item* add_to_cb(int i){
Item new_item(i);
cb.push_back(new_item);
return &cb.back();
}
int main(int argc, char** argv) {
Item * ptr1 = add_to_cb(14);
Item * ptr2 = add_to_cb(15);
Item * ptr3 = add_to_cb(16);
ptr1->print();
ptr2->print();
ptr3->print();
return 0;
}
结果是
数据:0
数据:0
数据:0
***。。/circ_buffers&#39;:双重免费或损坏(fasttop)错误:0x00000000016eb030 ** *
中止(核心倾销)
我理解new_item
在函数add_to_cb
的末尾被销毁,但我认为boost::circular_buffer::push_back()
存储了传递的对象的副本。如果不是这样,我怎么能解决这个问题呢?或者不同地问,circular_buffer
应该如何使用?