Double (à deux dimensions) tableau à l'aide de std::unique_ptr
J'ai un double tableau alloué par pointeur de pointeur.
//pointer to pointer
int **x = new int *[5]; //allocation
for (i=0; i<5; i++){
x[i] = new int[2];
}
for (i=0; i<5; i++){ //assignment
for (j=0; j<2; j++){
x[i][j] = i+j;
}
}
for (i=0; i<5; i++) //deallocation
delete x[i];
delete x;
Je suis en train de faire cela à l'aide de unique_ptr
:
std::unique_ptr<std::unique_ptr<int>[]> a(new std::unique_ptr<int>[5]);
for (i=0; i<5; i++)
a[i] = new int[2];
mais a gardé une erreur en disant que no operator = matches these operands
. Ce que je fais de mal ici?
OriginalL'auteur Evan | 2012-03-20
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas affecter un
int*
à unstd::unique_ptr<int[]>
, qui est la cause de votre erreur. Le code correct estCependant, piokuc est correct, qu'il est très rare d'utiliser des
unique_ptr
pour les tableaux, c'est ce questd::vector
etstd::array
sont, en fonction de si la taille est connue à l'avance.Tous ces éléments peuvent être initialisé et utilisé exactement la même chose que le code que vous avez déjà eu, sauf qu'elles sont plus faciles à construire, et vous n'avez pas à les détruire.
std::unique_ptr<int>(new int[2]);
aura du mal deleter, ça devrait êtrestd::unique_ptr<int[]>(new int[2]);
. De préemption +1 en supposant que vous allez résoudre ce problème. ;-]Je n'ai jamais utilisé
unique_ptr
de tableaux, je suis floue sur la syntaxe. Merci!Je vous remercie pour vos contributions!
Assurez-vous de upvote toutes les réponses que vous avez trouvé utile (avec la flèche vers le haut sur la gauche), et marque l'un à la réponse "correcte" (avec la coche juste sous les flèches).
OriginalL'auteur Mooing Duck
Si vous n'avez pas le luxe de l'aide d'un
std::array
ou unstd::vector
au lieu d'un tableau alloué dynamiquement, vous pouvez utiliser ununique_ptr
pour un tableau à deux dimensions en C++11 comme suit:La
unique_ptr
déclaration prend soin de l'allocation de l' ligne dimension de la matrice. La fuite()
dansnew int*[10]()
veille à ce que chaque colonne pointeur est initialisé ànullptr
.D'une boucle for puis alloue la colonne des tableaux:
Lorsque le
unique_ptr
est hors de portée, ses personnalisé deleter fonction lambda prend soin de la suppression de la colonne des tableaux avant de supprimer la ligne de la matrice. Lefor_each
expression utilise le default_delete foncteur._mm_malloc
et comment?Utilisation
__mm_malloc
pour allouer de la mémoire et de l'utilisation_mm_free
dans la deleter.Merci, j'ai obtenu ce travail. Vous avez oublié votre deuxième morceau, c'est à dire à allouer les lignes individuelles (sans cela, j'ai une erreur de segmentation). Travail sur un exemple d'utilisation de variadic templates, où je peux créer des multi-dimensions des tableaux, sans accéder aux données à l'aide de
.get()
.OriginalL'auteur sakra
Votre code est effectivement la manipulation d'un tableau de tableaux de int.
En C++ vous voulez normalement pour la mettre en œuvre comme:
Ce n'est pas une bonne affaire pour les unique_ptr. Aussi, vous ne devriez pas avoir besoin d'utiliser des pointeurs pour unique_ptr et d'allouer les unique_ptr objets dynamiquement. Le point de l'ensemble de unique_ptr est d'éliminer l'utilisation de pointeurs et de fournir automatique de l'allocation et la désallocation de l'objet.
tout RAII classe doit offrir la même garantie unique. La plupart des classes C++ sont RAII. Donc, vous devez utiliser le bon outil pour le travail. vecteur et matrice devrait être préféré à unique_ptr ici.
la raison pour unique ptrs est surtout de tenir allouée dynamiquement des objets uniques. Je ne peux pas immédiatement penser à une raison pour stocker un tableau dans un unique_ptr.
Il y a quelques cas d'utilisation (sûrement!) depuis qu'il est pris en compte spécifiquement dans la norme: le premier modèle
unique_ptr< T >
et de la spécialisationunique_ptr< T[] >
. Je suppose que c'est pas juste pour être complet, car il n'y a pas une telle spécialisation pourshared_ptr
.OriginalL'auteur piokuc
NON NON NON NON
//yo
OriginalL'auteur amigo
Les seules raisons que je peux penser à utiliser std::unique_ptr (ou dire boost::scoped_array) sur std::vector pour la tenue de tableaux ne sont généralement pas applicables...
1) il permet d'économiser 1 ou 2 pointeurs de la valeur de la mémoire, en fonction de si vous savez ce que la taille de tous les tableaux est [pas pertinent, sauf si vous avez un grand nombre de très petits tableaux]
2) dans le cas où vous êtes juste de passage du tableau dans une fonction qui attend un style C tableau ou pointeur brut, il peut se sentir comme un ajustement plus naturel. std::vector EST la garantie d'être sur séquentielle de stockage, donc en passant
(a.empty() ? nullptr : &a[0], a.size())
dans une telle fonction est 100% legit.3) des conteneurs standard dans MSVC mode de débogage sont "contrôlés" par défaut et très lente, ce qui peut être gênant lors d'émissions scientifiques sur de grands ensembles de données.
OriginalL'auteur yonil
Un exemple plus haut, m'a inspiré pour cette solution
Ici toutes les dimensions peuvent être dynamiques et vous pouvez l'envelopper à l'intérieur d'une classe et d'exposer un opérateur[]. Aussi la mémoire est allouée de manière contiguë et vous pouvez facilement introduire un allocateur, qui alloue aligné mémoire.
OriginalL'auteur Jens Munk
C'est une erreur courante ici.
x[i] est un tableau, donc vous devez supprimer chaque tableau de la première utilisation de delete[]
Ensuite, vous pouvez supprimer vous tableau de int* en utilisant delete[]
Corriger desallocation serait:
OriginalL'auteur Romain Bosq