est-il possible d'allouer un bloc de mémoire arbitraire en utilisant le "nouveau" opérateur? En C, je peux le faire comme "Void * p = malloc (7);" - Cela allouera 7 octets si l'alignement de la mémoire est défini sur 1 octet. Comment faire la même chose en C ++ avec le nouvel opérateur? P>
8 Réponses :
Vous ne pouvez pas affecter un «code> indicatif code> avec l'opérateur nouveau code>: vous devrez attribuer un type explicit tel que
char code> ou
uint8_t code>:
Je pense que vous recherchez peut-être PLACEMENT NEW a>. p>
J'ajouterais seulement que si vous allez utiliser de telles techniques comme le placement neuf, vous devez faire attention. Utilisez-le seulement si nécessaire !!
Comment le placement nouveau se rapporte-t-il à l'allocation de la mémoire?
@Miky D: Je suis d'accord, c'est pourquoi la page liée est assombrie avec le mot "danger" dans toutes les capsules. :-)
Peut-être que j'ai mal compris la question, mais je crois que cela pose du juste le contraire. C'est-à-dire que non comment créer / initialiser un objet dans un espace mémoire déjà alloué, mais plutôt comment allouer la mémoire sans effectuer l'appel du constructeur.
nouveau char [7]; p>
Traditionnellement, CHAR est un octet, bien que vous puissiez trouver des bibliothèques qui jouent un type d'octet. P>
Peu importe; Un caractère est le plus petit type que la mise en œuvre peut gérer. Si un caractère est de 16 bits, un type d'octet ne peut pas être inférieur à 16 bits. N'oubliez pas que la taille de (char) == 1. Toujours.
@David Thornley: Taillef (Char) n'est pas nécessaire 1, sinon toutes sortes de bibliothèques marshalling seront terriblement contrariées.
@florin: Taille de (caractère) == 1 Selon la norme. Voir la section 5.3.3 de l'ISO / CEI 14882: 2003. "Tailleof (Char), Taillef (Char) et Tailleof (Taille non signée) sont 1; le résultat de la taille de la taille de tout autre type fondamental (3.9.1) est défini par la mise en œuvre."
Um, oui, taille de (char) == 1. Au moins selon la section 5.3.3 de la norme ISO C ++ ( Open-Std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf ), mais ne sois pas ennuyeux, je Comme cette réponse à la question plus: Parasht.com/ C ++ - FAQ-Lite / Types intrinsèques.html # FAQ-26.1
@Andreas: N'est-ce pas ce que je viens de dire?
@Évan: J'ai écrit le commentaire en même temps. Votre commentaire n'était visible qu'après avoir appuyé sur le bouton. Comme j'ai de bonnes références dans la mienne, j'ai décidé de le garder même si cela dit essentiellement la même chose.
Vous pouvez faire char * pbuffer = nouveau char [7]; code>, et puisque la taille de (caractère) est 1 octet, vous pouvez l'utiliser comme tampon d'octet. Aussi, rappelez-vous d'utiliser
Suppr [] code> (avec []) lorsque vous relâchez la mémoire. P>
D'autres ont répondu à la question telle que écrit, mais j'aimerais suggérer de vous contacter avec MALLOC / GRATUIT pour de telles attributions. p>
nouveaux et supprimez sont destinés à allouer des objets. Ils allouent la mémoire requise et appellent des constructeurs / destructeurs d'appel. Si vous savez que vous avez juste besoin d'un bloc de mémoire arbitraire, à l'aide de MALLOC et gratuit est parfaitement raisonnable. P>
Mais si vous écrivez du code C ++, je pense qu'il est préférable d'utiliser de nouveaux / Supprimer depuis que vous l'utiliserez pour allouer les objets. Avoir deux types de fonctions d'allocation de mémoire ajoute plus la confusion.
-1. NEW / Supprimer sont des constructions de langue et introduisez la sécurité de type, quelle que soit votre allocation / distribue. malloc / libre sont des artefacts restants pour la compatibilité en arrière.
@RA, si l'on a besoin d'un bloc générique d'octets arbitraire, il n'y a pas de gain de croyance qu'ils sont spécialement chargés ou non signés de char ou de non signé - un vide * est plus honnête et explicite. +1 pour malloc!
L'OP stipule explicitement qu'elles s'attendent à un pointeur vide. En tant que tel, utiliser NEW / Supprimer présentera des types où ils peuvent ne pas les vouloir. Si le cas d'utilisation sera réellement comme une matrimonie de types, passez absolument basculer vers la nouvelle []. S'ils gèrent simplement un bloc de mémoire, il n'y a aucune raison d'introduire des types.
+1 d'ici. Oui, nouvelle / Supprimer Ajouter une sécurité de type, mais s'il ne veut pas affecter des types spécifiques, mais simplement un tampon de mémoire vierge, puis Malloc / Free fait exactement cela.
Bien que vous deviez passer par l'opérateur nouveau, comme la réponse acceptée, car elles pourraient être remplacées pour faire quelque chose.
Les blocs de mémoire arbitraires peuvent être attribués avec opérateur Nouveau code> en C ++; Pas avec le
nouvel opérateur code> qui est destiné à construire des objets.
::operator delete(pBlock);
+1 pour mentionner est i> un moyen de le faire sans malloc & gratuit :)
Aussi, soyez conscient que le nouvel opérateur passe généralement simplement le dollar à Malloc () de toute façon (sur chaque mise en œuvre, je suis au courant). Comme Dominic dit, pourrait aussi bien utiliser Malloc.
Merci beaucoup. C'est une réponse (":: opérateur nouveau"). J'ai passé beaucoup de temps à essayer de comprendre pourquoi le ":: nouveau (x);" ne fonctionne pas :)
Oui, vous pouvez.
Mais en fonction de ce que vous faites, il peut y avoir de meilleures techniques. p>
Pouvez-vous mettre à jour la question et nous dire ce que vous essayez d'atteindre. Avec plus de contexte, une meilleure solution pourrait être fournie. P>
Exemple:
Si vous allumez de manière dynamique un tampon à lire à partir d'une prise (car la taille n'est pas connue au moment de la compilation). Une alternative serait d'utiliser un vecteur et une taille dynamique qui. Vous pouvez ensuite obtenir un pointeur à l'intérieur du tampon en prenant l'adresse du premier élément. P>
Personnellement, j'utiliserais un Vous pouvez utiliser un std :: vecteur
std :: vecteur code> (en dehors de, peut-être,
redimension () code>), mais il n'y a pas de pénalité pour cela: < Pré> xxx pré>
std :: string code>, mais
std :: string code> implique "Cet objet contient des caractères qui ont un sens lorsqu'il est imprimé , "Où un
std :: vecteur