2017-08-09 52 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