Ï¡·¹¶¥¿Í×ÛºÏÉçÇøÏ¡·¹¶¥¿Í×ÛºÏÉçÇø

Ê×Ò³ | ×îÈȰæ¿é | »îÔ¾»áÔ± | ±¾ÖÜÈȵ㠷µ»ØCBuilder


·¢ÌùÈË:pspice
·¢±íʱ¼ä:2003Äê06ÔÂ11ÈÕ15:43:13 ÐÇÆÚÈý
Ò»¡¢"delete p" »áɾȥ "p" Ö¸Õ룬»¹ÊÇËüÖ¸µ½µÄ×ÊÁÏ£¬"*p" £¿

¸ÃÖ¸ÕëÖ¸µ½µÄ×ÊÁÏ¡£"delete" ÕæÕýµÄÒâ˼ÊÇ£º¡¸É¾È¥Ö¸ÕëÖ¸µ½µÄ¶«Î÷¡¹£¨delete
the thing pointed to by£©¡£Í¬ÑùµÄÓ¢ÎÄÎóÓÃÒ²·¢ÉúÔÚ C ÓïÑԵġ¸ÊÍ·Å¡¹Ö¸±êËùÖ¸Ïò
µÄ¼ÇÒäÌ壨"free(p)"ÕæÕýµÄÒâ˼ÊÇ£º"free_the_stuff_pointed_to_by(p)" £©¡£

¶þ¡¢ÄÜ "free()" µôÓÉ "new" ÅäÖõ½µÄ¡¢"delete" µôÓÉ "malloc()" ÅäÖõ½µÄ¼ÇÒäÌå
Âð£¿

²»ÐС£ÔÚͬһ¸ö³ÌʽÀʹÓà malloc/free ¼° new/delete ÊÇÍêÈ«ºÏ·¨¡¢ºÏÀí¡¢°²
È«µÄ£»µ« free µôÓÉ new ÅäÖõ½µÄ£¬»ò delete µôÓÉ malloc ÅäÖõ½µÄÖ¸±êÔòÊDz»ºÏ·¨
¡¢²»ºÏÀíµÄ¡£


Èý¡¢ÎªÊ²÷á¸ÃÓà "new" ¶ø²»ÊÇ malloc() £¿

½¨¹¹×Ó£¯½â¹¹×Ó¡¢Ðͱð°²È«ÐÔ¡¢¿É±»¸²¸Ç£¨overridability£©¡£½¨¹¹×Ó£¯½â¹¹×Ó£º
ºÍ "malloc(sizeof(Fred))" ²»Í¬£¬"new Fred()" »¹»áÈ¥ºô½ÐFred µÄ½¨¹¹×Ó¡£Í¬Àí£¬"
delete p" »áÈ¥ºô½Ð "*p" µÄ½â¹¹×Ó¡£
Ðͱð°²È«ÐÔ£ºmalloc() »á´«»ØÒ»¸ö²»¾ßÐͱð°²È«µÄ "void*"£¬¶ø "new Fred()" Ôò
»á´«»ØÕýÈ·ÐÍ̬µÄÖ¸±ê£¨Ò»¸ö "Fred*"£©¡£
¿É±»¸²¸Ç£º"new" ÊǸö¿É±»Îï¼þÀà±ð¸²¸ÇµÄÔËËã×Ó£¬¶ø "malloc" ²»ÊÇÒÔ¡¸¸÷¸öÀà
±ð¡¹×÷Ϊ¸²¸ÇµÄ»ù×¼¡£

ËÄ¡¢ÎªÊ²÷á C++ ²»Ìæ "new" ¼° "delete" ´îÅä¸ö "realloc()" £¿

±ÜÃâÄã²úÉúÒâÍâ¡£µ± realloc() Òª¿½±´ÅäÖÃÇøÊ±£¬Ëü×öµÄÊÇ¡¸ÖðλԪ bitwise¡¹µÄ
¿½±´£¬Õâ»áŪ»µ´ó
²¿·ÝµÄ C++ Îï¼þ¡£²»¹ý C++ µÄÎï¼þÓ¦¸Ã¿ÉÒÔ×ÔÎÒ¿½±´²Å¶Ô£ºÓÃËüÃÇ×Ô¼ºµÄ¿½±´½¨¹¹×Ó
»òÉ趨ÔËËã×Ó¡£

Îå¡¢¸ÃÔõÑùÅäÖã¯ÊÍ·ÅÕóÁУ¿

Óà new[] ºÍ delete[] £º

Fred* p = new Fred[100];
//...
delete [] p;

ÿµ±ÄãÔÚ "new" ÔËËãʽÖÐÓÃÁË "[...]" µÄ»°£¬Äã¾Í *!*±ØÐë*!* ÔÚ "delete" ³Â
ÊöÖÐʹÓà "[]" ¡£ÕâÓï·¨ÊDZØÒªµÄ£¬ÒòΪ¡¸Ö¸Ïòµ¥Ò»ÔªËصÄÖ¸±ê¡¹Ó롸ָÏòÒ»¸öÕóÁеÄ
Ö¸±ê¡¹ÔÚÓï·¨Éϲ¢ÎÞ·¨Çø·Ö¿ªÀ´¡£

Áù¡¢ÍòÒ»ÎÒÍüÁ˽« "[]" ÓÃÔÚ "delete" ÓÉ "new Fred[n]" ÅäÖõ½µÄÕóÁУ¬»á·¢Éúʲ÷á
Ê£¿

ÔÖÄÑ¡£ÕâÊdzÌʽÕߵģ­£­¶ø²»ÊDZàÒëÆ÷µÄ£­£­ÔðÈΣ¬È¥È·±£ new[] Óë delete[] µÄ
ÕýÈ·Åä¶Ô¡£ÈôÄãŪ´íÁË£¬±àÒëÆ÷²»»á²úÉúÈκαàÒëÆÚ»òÖ´ÐÐÆÚµÄ´íÎóѶϢ¡£¶Ñ»ý£¨heap
£©±»ÆÆ»µÊÇ×î¿ÉÄܵĽá¾Ö£¬»òÊǸüÔãµÄ£¬ÄãµÄ³Ìʽ»áµ±µô¡£

Æß¡¢³ÉÔ±º¯Êý×ö "delete this" µÄ¶¯×÷ÊǺϷ¨µÄ£¨²¢ÇÒÊǺõģ©Âð£¿

Ö»ÒªÄãСÐĵϰ¾ÍûÊ¡£ËùνµÄ¡¸Ð¡ÐÄ¡¹ÊÇ£º
1) ÄãµÃ 100% È·¶¨ "this" ÊÇÓÉ "new" ÅäÖÃÀ´µÄ£¨¶ø·Ç "new[]"£¬Òà·Ç×Ô¶©µÄ
"new" °æ±¾£¬Ò»¶¨ÒªÊÇ×îԭʼµÄ "new"£©¡£
2) ÄãµÃ 100% È·¶¨¸Ã³ÉÔ±º¯ÊýÊÇ´ËÎï¼þ×îááÒ»¸ö»áÈ¥ºô½ÐµÄ¡£
3) ×öÍê×ÔɱµÄ¶¯×÷ ("delete this;") áᣬÄã²»ÄÜÔÙÈ¥Åö "this" µÄÎï¼þÁË£¬°üÀ¨×ÊÁÏ
¼°ÔË×÷ÐÐΪÔÚÄÚ¡£
4) ×öÍê×ÔɱµÄ¶¯×÷ ("delete this;") áᣬÄã²»ÄÜÔÙÈ¥Åö "this" Ö¸±êÁË¡£»»¾ä»°Ëµ£¬
Äã²»Äܲ鿴Ëü¡¢½«ËüÓëÆäËûÖ¸±ê»òÊÇ NULL Ïà±È½Ï¡¢Ó¡³öÆäÖµ¡¢¶ÔËüתÐÍ¡¢¶ÔËü×öÈκÎ
ÊÂÇé¡£

ºÜ×ÔÈ»µÄ£¬ÕâÏ¸æÒ²ÊÊÓÃì¶£ºµ± "this" ÊǸöÖ¸Ïò»ùµ×Àà±ðµÄÖ¸±ê£¬¶ø½â¹¹×Ó²»
ÊÇvirtual µÄ³¡ºÏ¡£

°Ë¡¢¸ÃÔõ÷áÓà new À´ÅäÖöàάÕóÁУ¿

Óкܶ෽·¨£¬¶ËÊÓÄã¶ÔÕóÁдóСµÄÉìËõÐÔÖ®ÒªÇó¶ø¶¨¡£¼«¶ËÒ»µãµÄÇéÐΣ¬Èç¹ûÄãÔÚ
±àÒëÆÚ¾ÍÖªµÀËùÓÐÕóÁеÄά¶È£¬Äã¿ÉÒÔ¾²Ì¬µØÅäÖ㨾ÍÏñ C Ò»Ñù£©£º

class Fred { /*...*/ };

void manipulateArray()
{
Fred matrix[10][20];

//ʹÓà matrix[i][j]...

//²»ÐëÌØµØÈ¥ÊͷŸÃÕóÁÐ
}

ÁíÒ»¸ö¼«¶ËÇé¿ö£¬Èç¹ûÄãÏ£Íû¸Ã¾ØÕóµÄÿ¸öС¿é¶¼Äܲ»Ò»Ñù´ó£¬Äã¿ÉÒÔÔÚ×ÔÓɼÇÒä
ÌåÀïÅäÖÃÖ®£º

void manipulateArray(unsigned nrows, unsigned ncols[])
// nrows ÊǸÃÕóÁÐÖ®ÁÐÊý¡£
//ËùÒԺϷ¨µÄÁÐÊýΪ (0, nrows-1) ¿ªÇø¼ä¡£
// ncols[r] ÔòÊÇ r ÁеÄÐÐÊý ( r ÖµÓòΪ [0..nrows-1])¡£
{
Fred** matrix = new Fred*[nrows];
for (unsigned r = 0; r < nrows; ++r)
matrix[r] = new Fred[ ncols[r] ];

//ʹÓà matrix[i][j]...

//ÊͷžÍÊÇÅäÖõķ´¶¯×÷£º
for (r = nrows; r > 0; --r)
delete [] matrix[r-1];
delete [] matrix;
}

¾Å¡¢ÔõÑùÈ·±£Ä³Àà±ðµÄÎï¼þ¶¼ÊÇÓà "new" ½¨Á¢µÄ£¬¶ø·ÇÇøÓò»òÕûÌ壯¾²Ì¬±äÊý£¿

È·¶¨¸ÃÀà±ðµÄ½¨¹¹×Ó¶¼ÊÇ "private:" µÄ£¬²¢¶¨Òå¸ö "friend" »ò "static" º¯Êý
£¬À´´«»ØÒ»¸öÖ¸ÏòÓÉ "new" ½¨Ôì³öÀ´µÄÎï¼þ£¨°Ñ½¨¹¹×ÓÉè³É "protected:"£¬Èç¹ûÄãÏë
ÒªÓÐÑÜÉúÀà±ðµÄ»°£©¡£

class Fred { //Ö»ÔÊÐí Fred ¶¯Ì¬ÅäÖóöÀ´
public:
static Fred* create() { return new Fred(); }
static Fred* create(int i) { return new Fred(i); }
static Fred* create(const Fred& fred) { return new Fred(fred); }
private:
Fred();
Fred(int i);
Fred(const Fred& fred);
virtual ~Fred();
};

main()
{
Fred* p = Fred::create(5);
...
delete p;
}






Ïà¹ØÖ÷Ìâ:
×îÐÂÈÈÌù
 ¡ñ ÇóÖú