2017-08-09 11 views
0

循環バッファに上書きされる前にオブジェクトが削除されるのを防ぐ方法はありますか?ここに私の質問を説明するいくつかのコードです。boost circular_buffer holdingポインタ

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

私はここ石器時代でこだわっているとだけすることができますC++ 11の仕様を持たないgcc 4.4.7を使用し、 'std :: make_unique'を持たないので、スマートポインタはありません – mike

+0

コメントに重要な情報を追加するのではなく、質問を編集できます。 – sehe

答えて

0

これはスマートポインタの古典的なシナリオです。任意のスマートポインタ。

最も簡単な選択ははstdされるだろう

:: 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) 'と' Ptr(new MyObject(n)) 'を比較します。または、あなた自身の3行 'make_unique 'を書く: – sehe

+0

完全にC++の11プルーフバージョン:http://coliru.stacked-crooked.com/a/5029747707aa4cca – sehe

関連する問題