Magie dans le placement nouveau?
-
20-09-2019 - |
Question
Je joue avec l'allocation dynamique de la mémoire « à la main » et je voulais voir comment le placement nouveau est mis en œuvre par les gars de MS mais quand je débogage « entré dans » il m'a déplacé le code:
inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{ // construct array with placement at _Where
return (_Where);
}
Quelqu'un pourrait-il me expliquer comment diable ce code place mon objet en place pointé par mon pointeur quand tout ce que je peux voir dans ce code est conforme à la déclaration de retour avec ce que j'ai fourni comme argument. Je ne pense pas que dire dans le commentaire que je voudrais que ce fnc à faire est en fait assez pour que cela fonctionne. Merci pour toutes les réponses constructives.
La solution
Le but de operator new
est seulement à allouer de la mémoire pour un objet, et renvoyer le pointeur vers la mémoire. Lorsque vous utilisez le placement nouveau, vous êtes essentiellement dire au compilateur « Je sais que cette mémoire est bonne, passez directement l'allocation, et utiliser ce pointeur pour mon objet. » Votre constructeur de l'objet est alors appelé à l'aide du pointeur fourni par operator new
si oui ou non il était la mémoire qui vient d'être alloué ou spécifié en utilisant le placement nouveau. operator new
lui-même n'a pas d'incidence sur la façon dont votre objet est construit.
Autres conseils
Gardez à l'esprit que, ce new T(...)
(appelé une « nouvelle expression ») fait, est deux choses: l'allocation de mémoire et l'initialisation d'un objet. Vous pouvez modifier l'initialisation en écrivant des constructeurs. Pour l'allocation que vous écrivez operator new
. Ainsi, malgré le nom, operator new
ne fait que d'un côté de ce qu'une nouvelle expression fait.
Placement nouveau est là pour mettre un objet en mémoire pré-alloué. Vous ne pouvez pas appeler les constructeurs passer directement à la mémoire pré-allouée comme un pointeur this
. La seule chose que vous pouvez faire est le placement d'une utilisation nouvelle: Cette allocation s'en no-op, en laissant la construction ne reste à faire. Ce
inline void* operator new(size_t, void *p) throw()
{
return p;
}
est juste la mise en œuvre de ce no-op.