doublons possibles: strong>
Comment puis-je obtenir la taille d'un tableau d'un pointeur en C?
est là Toute façon de déterminer la taille d'un tableau C ++ programmatiquement? Et sinon, pourquoi? p> blockQuote>Je reçois un pointeur sur un morceau de mémoire allouée hors d'une fonction de style C. Maintenant, il serait vraiment intéressant de déboguer de savoir comment savoir comment grosse bloc de mémoire alloué que ce pointeur pointe est. P>
Y a-t-il quelque chose de plus élégant que de provoquer une exception en courant aveuglément sur ses frontières? P>
Merci d'avance, Andreas p>
EDIT: H3>
J'utilise VC ++ 2005 sous Windows et GCC 4.3 sur Linux P>
Edit2: h3>
J'ai
_msize code> sous VC ++ 2005 Malheureusement, il en résulte une exception en mode débogage .... p>
Edit3: h3>
Eh bien. J'ai essayé la façon dont j'ai décrit ci-dessus à l'exception et ça marche. Au moins pendant que je débogève et que je vous assure immédiatement après l'appel Pour les sorties de la bibliothèque, je cours sur les limites tampons. Fonctionne comme un charme. P>
Ce n'est tout simplement pas élégant et utilisable en code de production. P>
9 Réponses :
La bibliothèque d'exécution C ne fournit pas une telle fonction. En outre, provoquant délibérément une exception ne vous indiquera pas à quel point le bloc est grand non plus. P>
Généralement, la manière dont ce problème est résolu dans C est de maintenir une variable distincte qui maintient la trace de la taille du bloc attribué. Bien sûr, cela est parfois gênant mais il n'y a généralement pas d'autre moyen de savoir. P>
Votre bibliothèque d'exécution C mai em> fournir des fonctions de débogage de tas qui peuvent interroger des blocs alloués (après tout, gratuit () code> doit savoir à quel point le bloc est), mais aucun de ce genre de chose sera non sportif. p>
Non, et vous ne pouvez pas compter sur une exception lors de la poursuite de ses frontières, à moins que ce soit dans la documentation de votre implémentation. Cela fait partie des choses que vous n'avez vraiment pas besoin de savoir sur l'écriture de programmes. Creusez dans la documentation ou le code source de votre compilateur si vous voulez vraiment savoir. P>
Une raison particulière pour laquelle cela a été évité?
Non bownvote par moi, mais éventuellement parce que Malloc et l'accès à la mémoire Malloc'd n'est pas connu pour avoir lancé des exceptions, faisant partie de C.
Eh bien ça fait. Et je peux demander que la mémoire de la mémoire puis de provoquer la violation de l'accès et cela fonctionne simplement. Je fais cela en C ++ comme étant la balise, alors les exceptions sont levées.
Sous Windows, vous pourrait i> obtenir une exception structurée (violation d'accès), car c'est la manière dont le système d'exploitation communique que vous avez intervenu sur la ligne. Sur Linux, je pense que l'équivalent est une faute de segmentation. Que votre exécution convertit ou non ces exceptions C ++ est dépendante de la mise en œuvre.
C'est aussi sify. Comme vous le dites, sur Windows, vous pourriez avoir une violation d'accès, et sur Linux, vous pourriez avoir une faute de segmentation. Sans réellement savoir, je soupçonnerais que ceux-ci ont été causés par le gestionnaire de mémoire virtuel, et indiqueraient donc de laisser des pages de mémoire plutôt que des zones de mémoire allouées.
@David: Droite - Vous pouvez potentiellement vous retrouver dans une autre partie de la mémoire allouée, détruisant silencieusement d'autres structures de données (y compris celles utilisées par le gestionnaire de mémoire ...) ou lire des données de faux. Territoire dangereux ...
Il est pas standard, mais si votre bibliothèque a un Une solution commune consiste à envelopper msize () code> qui vous donnera la taille. P>
malloc code> avec votre propre fonction qui enregistre chaque demande ainsi que la taille et la portée de la mémoire résultant, dans la version release, vous pouvez revenir à la « vraie »
malloc code>. p>
+1 Je l'ai fait il y a cette année. Il est trivial de mettre en œuvre et très utile
Je n'ai aucun accès à la source.
Mais la pointe _msize pourrait filer. Merci!
Recherchez un package _debug_malloc. Il pourrait y avoir une bibliothèque d'exécution pour obtenir les informations Malloc au moins dans une construction de débogage. En général, même si vous ne devez concevoir votre code en supposant que cela soit possible
Vous pouvez également utiliser la fonction malloc_usable_size () code>, qui est fournie sur les plates-formes GNU.
Quelle bibliothèque qui a mie () code>?
Il n'y a pas de fonction C standard c pour le faire. Selon votre plate-forme, il peut y avoir une méthode non portable - quelle bibliothèque OS et C utilisez-vous? P>
Notez que provoquer une exception n'est pas fiable - il peut y avoir d'autres allocations immédiatement après que le morceau que vous avez, et vous ne comprenez donc pas une exception tant que longtemps après avoir dépassé les limites de votre morceau actuel. P>
La façon de faire ce que vous voulez, c'est être em> l'allocator. Si vous filtrez toutes les demandes, puis enregistrez-les à des fins de débogage, vous pouvez découvrir ce que vous voulez lorsque la mémoire est libre. p>
En outre, vous pouvez vérifier à la fin du programme pour voir si tous les blocs alloués ont été libérés, et sinon, les énumérer. Une bibliothèque ambitieuse de ce type pourrait même prendre Enfin, MSVCRT de Microsoft fournit à AA HeaP de la rapatriement disposant de nombreux outils utiles que vous pouvez utiliser dans votre version de débogage pour trouver des problèmes de mémoire: http://msdn.microsoft.com/en-us/library/bebs9zyz.aspx P>
sur Linux, vous pouvez utiliser Valgrind pour trouver de nombreuses erreurs. http://valgrind.org/ p>
Ce n'est pas moi qui alloue le MEM, c'est une bibliothèque que je n'ai aucun accès à la source.
Les dames de mémoire comme Memcheck de Valgrind's et TCMALLOC de Google (la partie du checker en tas) Gardez une trace de ce genre de chose. p>
Vous pouvez utiliser TCMALLOCC pour vider un profil de tas indiquant où les choses ont été allouées ou que vous pouvez simplement avoir une vérification pour vous assurer que votre tas est identique à deux points de l'exécution du programme en utilisant SAMEHAP () . P>
Je vais certainement vérifier cela.
Si cela ne vous dérange pas de violence assiégée pour le débogage, vous pouvez #define macros à accrocher des appels vers Malloc et gratuitement et les premiers 4 octets avec la taille.
à la hauteur de p> puis p> et ainsi sur p> p>
Outre les problèmes d'alignement, c'est en fait la meilleure façon de le faire de manière portable. Si vous utilisez quelque chose de plus aventureux comme Dlmalloc, vous pourriez profiter d'une faible liaison, mais pour une application PC, cela est probablement surchargé.
Cela semble bon aussi, mais je n'ai pas accès au code.
Depuis que je réponds sans le savoir une question en double avec une solution presque identique, elle doit mériter un vote à la hausse!
Cela n'a pas fonctionné comme écrit, il semble y avoir quelques problèmes, mais je l'ai eu pour travailler. Jolie hack!
@AccrochingDarknessfish Pourriez-vous poster le code?
avec et compiler avec p> (bien sûr, cela fonctionnera également avec C ++ Code compilé avec G ++, et avec le nouvel opérateur (à travers son nom de fumée) si vous le souhaitez.) P> En effet, la bibliothèque chargée de manière statique / dynamique utilisera également votre gcc code> et le liant
gnu code>, vous pouvez facilement envelopper
malloc code>
__ wrap_malloc code>. p> p>
Vraiment? Comment est-ce possible? Code du fichier de certains .a ou .so qui n'a aucune information de débogage être écrasée par cela? Si oui: cool! B)
Faibles références. La liaison remplacera les références de symboles à Malloc pour vous et les signifiera à l'endroit que vous spécifiez.
Yup, aucune information de débogage nécessaire, toute bibliothèque contient une table de symboles pour les symboles qu'il fournit et pour les symboles nécessaires pour aller d'ailleurs. Vous pouvez donc dire à la lieur quelle fonction pour se lier avec le symbole Malloc de votre exécutable.
solution partielle: sous Windows Vous pouvez utiliser la PageHeap est un autre gestionnaire de mémoire présent dans le noyau Windows (dans les variétés NT mais personne ne doit utiliser d'autre version de nos jours). Il faut chaque allocation dans un processus et renvoie un bloc de mémoire qui a une fin alignée avec la fin d'une page de mémoire, puis il rend la page suivante inaccessible (pas de lecture, pas d'accès en écriture). Si le programme tente de lire ou d'écrire au-delà de la fin du bloc, vous obtiendrez une violation d'accès que vous pouvez attraper avec votre débogueur préféré. P>
Comment obtenir: Téléchargez et installez les outils de débogage de l'emballage pour Windows à partir de Microsoft: http://www.microsoft.com/whdc/devtools/debugging/default.mspx p>
Lancez ensuite l'utilitaire GFLAGS, accédez à la 3ème onglet et entrez le nom de votre exécutable, puis appuyez sur la touche. Cochez la case pageHeap, cliquez sur OK et vous êtes prêt à partir. P>
La dernière chose: lorsque vous avez terminé avec le débogage, n'oubliez jamais de lancer des gfrags à nouveau et de désactiver la pageHeap pour l'application. Gflags entre dans ce paramètre dans le registre (sous Sous HKLM \ Software \ Options d'exécution de fichier Microsoft \ Windows NT \ Microsoft \ Windows NT \ Microsoft \ Windows NT \ CurrentVersion \ Options d'exécution de fichier \), elle est donc persistante, même à travers les redémarrages. P>
également, soyez conscient que l'utilisation de PageHeap peut considérablement augmenter énormément les besoins de mémoire de votre application. P>
Voir: Stackoverflow.com/questions/197839/... et: Stackoverflow.com/Questtions/232691/ARRAY-SIZE-FROM-PORTER-I NC
Il n'y avait pas de réponses utiles là-bas.
@Andreast: Pouvez-vous élaborer à ce sujet? Que recherchez-vous qui ne répondez pas à l'une ou l'autre de ces questions ( Stackoverflow.com/Questtions/232691/araye-Size-de-Conse- in-C semble particulièrement proche de ce que vous demandez ici). À l'heure actuelle, cela ressemble à un duplicata - si vous pouviez clarifier ce que vous cherchez à faire, nous pourrions peut-être identifier des réponses qui mieux correspondent ...
Sur le site que vous avez mentionné, que la recherche ne m'a pas proposée, c'est la réponse numéro trois, pas la solution acceptée, qui fournit ces informations: mie () ou des fonctions similaires (_msize () etc.). Je ne cherchais pas la taille des tableaux, je veux savoir à quel point la mémoire d'octets a été allouée à une position donnée. Ceci est bien sûr plus ou moins le même problème, car en particulier dans C, vous allouez des tableaux et des blocs de mémoire de la même manière. Mais je n'ai pas besoin de savoir sur les tableaux qui pourraient avoir des informations de taille attachées. J'avais besoin de la taille d'un bloc de mémoire alloué.
La similitude en C n'était pas évidente pour moi.
@Andreeast - Comme Thirtytheforty a mentionné ici, voir la réponse suivante (pour une question similaire): Stackoverflow.com/a/1281720/1971003<< a>