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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top