J'ai récemment vu quelques projets open source qui le font réellement; renvoie un pointeur non sécurisé à partir d'une fonction telle que: "int * input = this.someIterator.GetUnsafePtr()". D'après ce que j'ai compris, cela doit être complètement faux. Les pointeurs non sécurisés ne peuvent être obtenus que via des instructions 'fixed' et certainement ceux qui sont retournés depuis une fonction ne seront plus épinglés (ils perdront leur portée déclarante), ce qui les fera éventuellement être récupérés. Mais je ne me souviens pas non plus que le compilateur ait donné un avertissement à ce sujet, alors pourquoi s'embêter à utiliser une instruction fixe si les pointeurs «épinglés» peuvent être répartis partout?Pourquoi est-il autorisé à renvoyer des pointeurs non sécurisés depuis une fonction?
Répondre
Je n'ai jamais vu de telles constructions dans des projets open source. Il vaudra mieux que vous fournissiez quelques exemples d'un tel usage dans votre question. Le sens de cela peut dépendre du comportement.
Mais je suis d'accord, les pointeurs dangereux sont mauvais et ne devraient être utilisés que lorsque vous interagissez avec des bibliothèques ou du code natif. Autant que je m'en souvienne, vous pouvez utiliser cette construction uniquement dans un bloc dangereux. Donc je pense que le compilateur ne donnera aucun avertissement ici. Et IMO, il est préférable d'utiliser IntPtr (les blocs dangereux peuvent être exécutés uniquement en confiance totale).
EDIT:
@Stephen a raison, IntPtr ne conserve pas la référence à l'objet sur la collection GC.
Que diriez-vous, Marshal.AllocHGlobal
ou Marshal.AllocCoTaskMem
, à la fois le retour IntPtr, qui peut être librement jeté à void *
en utilisant la fonction .ToPointer()
?
Ou le pointeur peut provenir d'un code non géré. Vous avez besoin de mémoire fix/pin
parce que la mémoire est gérée, donc tant que ce n'est pas fixed/pinned
le garbage collector est libre de le déplacer, ce qui rend le pointeur invalide.
- 1. Cette page contient à la fois des articles sécurisés et non sécurisés et des iframes
- 2. IE6 Articles non sécurisés
- 3. IE - «Cette page contient à la fois des articles sécurisés et non sécurisés»
- 4. Message d'éléments sécurisés et non sécurisés dans IE
- 5. Renvoyer une énumération à partir d'une fonction dans C?
- 6. HTTP 401 Non autorisé System.Web.Services
- 7. « Cette page contient des éléments sécurisés et non sécurisés » Thèmes et SSL
- 8. chaîne de répéteur non autorisé
- 9. Définition de pointeurs de fonction
- 10. WebClient.UploadData error: (401) Non autorisé
- 11. appelant une fonction javascript depuis activex
- 12. Attention lors de l'utilisation des pointeurs de fonction en C
- 13. Exception d'accès non autorisé - comment accéder?
- 14. Renvoyer plusieurs auto_ptrs à partir d'une fonction
- 15. Ctypes Python et pointeurs de fonction
- 16. Comment déclencher une exception 401 (accès non autorisé) dans Sharepoint?
- 17. WebServiceTransportException: non autorisé [401] dans Spring-WS
- 18. appeler une fonction VB.net depuis javascript
- 19. Spécialisation partielle C++ (Pointeurs de fonction)
- 20. Pointeurs de fonction et rappels dans C
- 21. Aide - Pointeurs de fonction en Python
- 22. Traversées récursives C++ avec pointeurs de fonction
- 23. Comment renvoyer une chaîne composée dans une fonction ToString substituée?
- 24. Les pointeurs de fonction coulent en C++
- 25. Initialiser un tableau de pointeurs vers des pointeurs
- 26. Pointeurs de fonction dans Inno Setup
- 27. Erlang: Noeud non autorisé/Peut-être Question de cookie
- 28. Pourquoi les programmes sécurisés sont-ils si difficiles à développer (pour moi)?
- 29. Comment configurer 2 actions avec le même nom, 1 autorisé et 1 non autorisé?
- 30. Pointeurs opaques en F77
IntPtr n'est pas un pointeur de suivi. Si un IntPtr fait référence à un objet géré et que cet objet est déplacé, le pointeur n'est pas mis à jour. Il n'y a pas de différence réelle entre un IntPtr et un pointeur non sécurisé, si ce n'est qu'un IntPtr est conforme à CLS et n'est pas "dangereux". –
Vous avez raison, merci. Je pense que j'ai encore besoin de lire sur le CLR. – zihotki