在没有指针的情况下将对象存储在boost :: circular_buffer中

时间:2015-05-26 17:13:28

标签: c++ boost circular-buffer

我无法理解如何使用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应该如何使用?

0 个答案:

没有答案