2017-08-09 48 views
0

有没有一种方法可以确保我的对象在循环缓冲区中被覆盖之前被删除?这里有一些代码来说明我的问题。boost circular_buffer控股指针

boost::circular_buffer<MyObject*> cBuf(5); 
cBuf.push_back(new MyObject()); // cBuf[0] 
cBuf.push_back(new MyObject()); // cBuf[1] 
cBuf.push_back(new MyObject()); // cBuf[2] 
cBuf.push_back(new MyObject()); // cBuf[3] 
cBuf.push_back(new MyObject()); // cBuf[4] 

// before this overwrite occurs, how do i make sure the pointer 
// position cBuf[0] is deleted? 
cBuf.push_back(new MyObject()); // this will overwrite position 0 
+0

我是停留在石器时代这里,只能使用gcc 4.4.7,它没有C++ 11规范,因此没有'std :: make_unique',所以没有智能指针 – mike

+0

您可以(也应该)编辑您的问题,而不是在评论中添加重要信息。 – sehe

回答

0

这是智能指针的经典场景。任何智能指针。

最简单的选择将标准::的unique_ptr:

Live On Coliru

#include <boost/circular_buffer.hpp> 
#include <iostream> 

struct MyObject { 
    MyObject(int i) : _i(i) { std::cout << __FUNCTION__ << " _i=" << _i << "\n"; } 
    ~MyObject()    { std::cout << __FUNCTION__ << " _i=" << _i << "\n"; } 
    int _i; 
}; 

int main() { 
    using Ptr = std::unique_ptr<MyObject>; 
    boost::circular_buffer<Ptr> cBuf(5); 
    cBuf.push_back(std::make_unique<MyObject>(0)); // cBuf[0] 
    cBuf.push_back(std::make_unique<MyObject>(1)); // cBuf[1] 
    cBuf.push_back(std::make_unique<MyObject>(2)); // cBuf[2] 
    cBuf.push_back(std::make_unique<MyObject>(3)); // cBuf[3] 
    cBuf.push_back(std::make_unique<MyObject>(4)); // cBuf[4] 

    std::cout << "Full, pushing extra\n"; 

    cBuf.push_back(std::make_unique<MyObject>(5)); // this will overwrite position 0 

    std::cout << "Done\n"; 
} 

打印:

MyObject::MyObject _i=0 
MyObject::MyObject _i=1 
MyObject::MyObject _i=2 
MyObject::MyObject _i=3 
MyObject::MyObject _i=4 
Full, pushing extra 
MyObject::MyObject _i=5 
MyObject::~MyObject _i=0 
Done 
MyObject::~MyObject _i=1 
MyObject::~MyObject _i=2 
MyObject::~MyObject _i=3 
MyObject::~MyObject _i=4 
MyObject::~MyObject _i=5 
+0

感谢@sehe的回应。我应该在描述中注明,我在这里被困在石器时代,只能使用gcc 4.4.7,它没有C++ 11规范,因此没有'std :: make_unique' – mike

+0

因此,将'std :: make_unique (n)'with'Ptr(new MyObject(n))'。或者写你自己的3行'make_unique ':) – sehe

+0

完全C++ 11-proofed版本:http://coliru.stacked-crooked.com/a/5029747707aa4cca – sehe