8
votes

Allocation de mémoire en C ++

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?


0 commentaires

8 Réponses :


8
votes

Vous ne pouvez pas affecter un «code> indicatif avec l'opérateur nouveau : vous devrez attribuer un type explicit tel que char ou uint8_t : xxx


0 commentaires



2
votes

Vous pouvez faire char * pbuffer = nouveau char [7]; , et puisque la taille de (caractère) est 1 octet, vous pouvez l'utiliser comme tampon d'octet. Aussi, rappelez-vous d'utiliser Suppr [] (avec []) lorsque vous relâchez la mémoire.


0 commentaires

11
votes

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.

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.


6 commentaires

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.



45
votes

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);


3 commentaires

+1 pour mentionner est 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 :)



3
votes

Oui, vous pouvez.
Mais en fonction de ce que vous faites, il peut y avoir de meilleures techniques.

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.

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.


0 commentaires

3
votes

Personnellement, j'utiliserais un std :: vecteur . Non seulement vous obtenez un bloc arbitraire d'octets ( Garanti d'être contiguë ), vous les obtenez dans un wrapper Raii. Bien sûr, il n'est pas nécessaire d'utiliser aucun des méthodes std :: vecteur (en dehors de, peut-être, redimension () ), mais il n'y a pas de pénalité pour cela: < Pré> xxx

Vous pouvez utiliser un std :: string , mais std :: string implique "Cet objet contient des caractères qui ont un sens lorsqu'il est imprimé , "Où un std :: vecteur implique" Cet objet contient un groupe d'octets arbitraire "


0 commentaires