2017-08-09 3 views
0

Y at-il un moyen de m'assurer que mon objet est supprimé avant qu'il ne soit écrasé dans un tampon circulaire? voici un code pour illustrer ma question.booster les pointeurs de maintien 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

je suis coincé dans l'âge de pierre ici et ne peut utilise gcc 4.4.7 qui n'a pas la spécification C++ 11 et donc pas std :: make_unique' donc pas de pointeurs intelligents – mike

+0

Vous pouvez (et devriez) éditer votre question au lieu d'ajouter des informations vitales dans les commentaires. – sehe

Répondre

0

Ceci est le scénario classique pour les pointeurs intelligents. Tout pointeur intelligent.

Le choix le plus simple serait 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"; 
} 

Prints:

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

merci @sehe pour la réponse. Je devrais avoir noté dans la description que je suis coincé dans les âges de pierre ici et ne peut utiliser que gcc 4.4.7 qui n'a pas la spécification C++ 11 et donc pas de 'std :: make_unique' – mike

+0

Donc, remplacer' std :: make_unique (n) 'avec' Ptr (nouveau MyObject (n)) '. Ou écrivez votre propre 3 lignes 'make_unique ' :) – sehe

+0

Entièrement C++ version 11-proofed: http://coliru.stacked-crooked.com/a/5029747707aa4cca – sehe