2010-12-06 19 views
0

J'ai un shared_array: boost :: shared_array myarr (new char [m_length]);réaffectation boost :: shared_array

Je voudrais réallouer le tableau. J'ai pensé à créer un nouveau shared_array avec la taille désirée et en utilisant la méthode swap boost mais cela copiera également le nombre de références. Avez-vous une autre idée?

//new_length>m_length 
void func(boost::shared_array<char> &myarr,int new_length) 
{ 
     boost::shared_array<char> new_arr(new char[new_length]); 
     myarr.swap(new_arr); 
} 

Répondre

2

Pourquoi ne pas simplement utiliser à la place un boost::shared_ptr<std::vector<char> >? Laissez la bibliothèque standard gérer le redimensionnement.

(En fait, selon la raison pour laquelle vous utilisiez shared_array en premier lieu, vous pourriez bien vous en sortir avec juste en utilisant un std :: vecteur, et en passant par référence soigneusement autour.)

+0

Je souhaite m'assurer que le contenu n'est pas copié par valeur. C'est pourquoi j'utilise shared_array. Comment est la performance de boost :: sharerd_ptr :: vector Tal

+0

Un shared_ptr à un vecteur va probablement créer un niveau supplémentaire d'indirection, mais sinon tout est aussi soigné que possible - les données sont contiguës. Si tout ce que vous voulez faire est d'empêcher la copie, vous pouvez simplement créer une classe héritant de boost :: noncopyable, avoir un membre std :: vector et exposer l'interface désirée. –

1

boost :: shared_array :: reset devrait faire l'affaire

myarr.reset(new char[new_length]); 

boost :: shared_array :: reset supprime l'ancien tableau alloué, en échangeant avec celui nouvellement affecté.

Edit: Ignorer cette réponse, il ne résout pas son problème

+1

-t-elle garder la compteur de référence de l'ancien? Copie-t-il la valeur du tableau dans le nouveau? J'ai besoin de la même valeur mais dans un tableau de plus grande taille. – Tal

+1

Peu importe, j'ai mal compris la question. Ignorer – tyree731