ƵµÀÀ¸Ä¿
Ê×Ò³ > ³ÌÐò¿ª·¢ > Èí¼þ¿ª·¢ > C++ > ÕýÎÄ
¹ØÓÚC++ÖÐnew¡¢operator newºÍplacement newµÄÇø±ðÏê½â
2019-12-13 16:53:12         À´Ô´£º¶ßÀ²AÑþµÄ²©¿Í  
Êղؠ  ÎÒҪͶ¸å

newºÍdelete²Ù×÷·ûÎÒÃÇÓ¦¸Ã¶¼Óùý£¬ËüÃÇÊǶԶÑÖеÄÄÚ´æ½øÐÐÉêÇëºÍÊÍ·Å£¬¶øÕâÁ½¸ö¶¼ÊDz»Äܱ»ÖØÔصÄ¡£ÒªÊµÏÖ²»Í¬µÄÄÚ´æ·ÖÅäÐÐΪ£¬ÐèÒªÖØÔØoperator new£¬¶ø²»ÊÇnewºÍdelete¡£

¿´ÈçÏ´úÂ룺

class MyClass {…};

MyClass * p=new MyClass;

ÕâÀïµÄnewʵ¼ÊÉÏÊÇÖ´ÐÐÈçÏÂ3¸ö¹ý³Ì£º

1µ÷ÓÃoperator new·ÖÅäÄڴ棻

2µ÷Óù¹Ô캯ÊýÉú³ÉÀà¶ÔÏó£»

3·µ»ØÏàÓ¦Ö¸Õë¡£

operator new¾ÍÏñoperator+Ò»Ñù£¬ÊÇ¿ÉÒÔÖØÔØµÄ£¬µ«ÊDz»ÄÜÔÚÈ«¾Ö¶ÔÔ­ÐÍΪvoid operator new(size_t size)Õâ¸öÔ­ÐͽøÐÐÖØÔØ£¬Ò»°ãÖ»ÄÜÔÚÀàÖнøÐÐÖØÔØ¡£Èç¹ûÀàÖÐûÓÐÖØÔØoperator new£¬ÄÇôµ÷ÓõľÍÊÇÈ«¾ÖµÄ::operator newÀ´Íê³É¶ÑµÄ·ÖÅ䡣ͬÀí£¬operator new[]¡¢operator delete¡¢operator delete[]Ò²ÊÇ¿ÉÒÔÖØÔØµÄ£¬Ò»°ãÄãÖØÔØÁËÆäÖÐÒ»¸ö£¬ÄÇô×îºÃ°ÑÆäÓàÈý¸ö¶¼ÖØÔØÒ»±é¡£

placement newÊÇoperator newµÄÒ»¸öÖØÔØ°æ±¾£¬Ö»ÊÇÎÒÃǺÜÉÙÓõ½Ëü¡£Èç¹ûÄãÏëÔÚÒѾ­·ÖÅäµÄÄÚ´æÖд´½¨Ò»¸ö¶ÔÏó£¬Ê¹ÓÃnewÊDz»ÐеÄ¡£Ò²¾ÍÊÇ˵placement newÔÊÐíÄãÔÚÒ»¸öÒѾ­·ÖÅäºÃµÄÄÚ´æÖУ¨Õ»»ò¶ÑÖУ©¹¹ÔìÒ»¸öеĶÔÏó¡£Ô­ÐÍÖÐvoid*pʵ¼ÊÉϾÍÊÇÖ¸ÏòÒ»¸öÒѾ­·ÖÅäºÃµÄÄڴ滺³åÇøµÄµÄÊ×µØÖ·¡£

ÎÒÃÇÖªµÀʹÓÃnew²Ù×÷·û·ÖÅäÄÚ´æÐèÒªÔÚ¶ÑÖвéÕÒ×ã¹»´óµÄÊ£Óà¿Õ¼ä£¬Õâ¸ö²Ù×÷ËÙ¶ÈÊǺÜÂýµÄ£¬¶øÇÒÓпÉÄܳöÏÖÎÞ·¨·ÖÅäÄÚ´æµÄÒì³££¨¿Õ¼ä²»¹»£©¡£placement new¾Í¿ÉÒÔ½â¾öÕâ¸öÎÊÌâ¡£ÎÒÃǹ¹Ôì¶ÔÏó¶¼ÊÇÔÚÒ»¸öÔ¤ÏÈ×¼±¸ºÃÁ˵ÄÄڴ滺³åÇøÖнøÐУ¬²»ÐèÒª²éÕÒÄڴ棬ÄÚ´æ·ÖÅäµÄʱ¼äÊdz£Êý£»¶øÇÒ²»»á³öÏÖÔÚ³ÌÐòÔËÐÐÖÐ;³öÏÖÄÚ´æ²»×ãµÄÒì³£¡£ËùÒÔ£¬placement new·Ç³£ÊʺÏÄÇЩ¶Ôʱ¼äÒªÇó±È½Ï¸ß£¬³¤Ê±¼äÔËÐв»Ï£Íû±»´ò¶ÏµÄÓ¦ÓóÌÐò¡£

ʹÓ÷½·¨ÈçÏ£º

1. »º³åÇøÌáǰ·ÖÅä

¿ÉÒÔʹÓöѵĿռ䣬Ҳ¿ÉÒÔʹÓÃÕ»µÄ¿Õ¼ä£¬ËùÒÔ·ÖÅ䷽ʽÓÐÈçÏÂÁ½ÖÖ£º

class MyClass {…};

char *buf=new char[N*sizeof(MyClass)+ sizeof(int) ] ; »òÕßchar buf[N*sizeof(MyClass)+ sizeof(int) ];

2. ¶ÔÏóµÄ¹¹Ôì

MyClass * pClass=new(buf) MyClass;

3. ¶ÔÏóµÄÏú»Ù

Ò»µ©Õâ¸ö¶ÔÏóʹÓÃÍê±Ï£¬Äã±ØÐëÏÔʽµÄµ÷ÓÃÀàµÄÎö¹¹º¯Êý½øÐÐÏú»Ù¶ÔÏó¡£µ«´ËʱÄÚ´æ¿Õ¼ä²»»á±»ÊÍ·Å£¬ÒÔ±ãÆäËûµÄ¶ÔÏóµÄ¹¹Ôì¡£

pClass->~MyClass();

4. ÄÚ´æµÄÊÍ·Å

Èç¹û»º³åÇøÔÚ¶ÑÖУ¬ÄÇôµ÷ÓÃdelete[] buf;½øÐÐÄÚ´æµÄÊÍ·Å£»Èç¹ûÔÚÕ»ÖУ¬ÄÇôÔÚÆä×÷ÓÃÓòÄÚÓÐЧ£¬Ìø³ö×÷ÓÃÓò£¬ÄÚ´æ×Ô¶¯ÊÍ·Å¡£

µã»÷¸´ÖÆÁ´½Ó ÓëºÃÓÑ·ÖÏí!»Ø±¾Õ¾Ê×Ò³
ÉÏһƪ£ºC++»ù±¾ÓïÑÔ-×Ö·û´®string¡¢ÏòÁ¿vectorºÍÊý×éʵÀý½éÉÜ
ÏÂһƪ£ºC++¹ØÓÚ×óÖµ£¬ÓÒÖµ£¬×óÖµÒýÓã¬ÓÒÖµÒýÓã¬std::move, std::fowardµÈ֪ʶ½²½â
Ïà¹ØÎÄÕÂ
ͼÎÄÍÆ¼ö
µã»÷ÅÅÐÐ

¹ØÓÚÎÒÃÇ | ÁªÏµÎÒÃÇ | ¹ã¸æ·þÎñ | Ͷ×ʺÏ×÷ | °æÈ¨ÉêÃ÷ | ÔÚÏß°ïÖú | ÍøÕ¾µØÍ¼ | ×÷Æ··¢²¼ | Vip¼¼ÊõÅàѵ | ¾Ù±¨ÖÐÐÄ

°æÈ¨ËùÓÐ: È«·å°²È«ÁªÃË--ÖÂÁ¦ÓÚ×öʵÓõÄIT¼¼ÊõÑ§Ï°ÍøÕ¾