这是内存泄æ¼å—?

时间:2010-05-17 21:18:00

标签: c++ pointers memory-leaks

char *pointer1;
char *pointer2;

pointer1 = new char[256];
pointer2 = pointer1;

delete [] pointer1;

æ¢å¥è¯è¯´ï¼Œæˆ‘还必须åšdelete [] pointer2å—?

谢谢ï¼

11 个答案:

答案 0 :(得分:17)

ä¸ï¼Œé‚£ä¸ªä»£ç å¾ˆå¥½ï¼Œä¸ä¼šæ³„æ¼å†…存。

ä½ åªéœ€è¦ä½¿ç”¨delete []一次,因为你åªä½¿ç”¨ä¸€ä¸ªnewæ¥ä¸ºå†…存分é…一个区域,å³ä½¿æœ‰ä¸¤ä¸ªæŒ‡å‘åŒä¸€ä¸ªå†…存的指针。

答案 1 :(得分:7)

一个简å•çš„规则:您需è¦ä¸Ždelete一样多的new s。更好的是,使用智能指针或容器之类的东西为你照顾它。

å¦ä¸€ä¸ªå°é—®é¢˜ï¼špointer2在delete上致电pointer1åŽï¼Œæ­£å˜æˆâ€œæ‚¬ç©ºæŒ‡é’ˆâ€ã€‚

答案 2 :(得分:4)

è¿™ä¸æ˜¯æ³„æ¼ï¼Œä½†å´åœ¨å¯»æ‰¾éº»çƒ¦ã€‚åªè¦æ‚¨åˆ é™¤pointer2,pointer1就会指å‘è°çŸ¥é“什么。这就是所谓的“悬垂指针â€ã€‚使用它å¯ä»¥åœ¨æœ€å¥½çš„情况下导致段错误,并且在最å的情况下å¯èƒ½å¯¼è‡´åœ¨æœ€ç»ˆåˆ†é…相åŒç‚¹çš„任何事物中出现神秘数æ®é”™è¯¯ã€‚

答案 3 :(得分:2)

虽然它ä¸ä¼šæ³„æ¼å†…存,但如果你想è¦æ˜¾å¼ï¼Œä½ åº”该将point1å’Œpoint2都设置为NULL(并以这ç§æ–¹å¼åˆå§‹åŒ–它们。)

答案 4 :(得分:2)

此外,请考虑使用Boost库中的boost::shared_ptr<>。这是切片é¢åŒ…以æ¥æœ€æ£’的东西。

typedef boost::shared_ptr<TypeX> StrRef;

foo() {
  StrRef pointer1(new TypeX);

  while(something) {
    StrRef pointer2 = pointer1;
    // do stuff
  }

 return;
}

当指å‘它的最åŽä¸€ä¸ªæŒ‡é’ˆè¶…出范围时,将删除数æ®ï¼ˆTypeX)。如果您ä¸éœ€è¦å¼•ç”¨è®¡æ•°ï¼Œåˆ™å¯ä»¥ä½¿ç”¨å†…ç½®auto_ptr<>类型执行类似的æ“作:

typedef auto_ptr<TypeX> StrRef;

foo() {
  StrRef pointer1(new TypeX);

  while(something) {
    TypeX * pointer2 = pointer1.get();
    subroutine(pointer2);
    if (condition) return;
  }

 return;
}

æ¯å½“pointer1超出范围时,它都会删除数æ®ã€‚这样åšçš„好处是你ä¸å¿…记得在底部的return语å¥ä¹‹å‰æ”¾ç½®ä¸€ä¸ªåˆ é™¤ï¼Œå¦‚æžœpointer1由于任何其他原因超出范围(å³ä»Žå¾ªçŽ¯çš„中间返回,或者subroutine()抛出异常,然åŽæ•°æ®ä»ç„¶ä¼šè¢«æ­£ç¡®é‡Šæ”¾ã€‚

我尚未测试此代ç ï¼Œå› æ­¤æ‚¨å¿…须自行检查auto_ptr<>å’Œboost::shared_ptr<>的文档。

我强烈建议尽å¯èƒ½ä½¿ç”¨Boost库。它是由专业人士编写的,它基本上是C ++扩展的临时区域。

答案 5 :(得分:1)

delete删除new分é…的内存。由于您åªæœ‰ä¸€ä¸ªnew,因此åªéœ€è¦ä¸€ä¸ªdelete。

答案 6 :(得分:0)

仅在使用新

时使用删除

好的åšæ³•æ˜¯å°†æŒ‡é’ˆè®¾ç½®ä¸ºNULL,但如果你没有

,就ä¸ä¼šæœ‰å†…存泄æ¼

答案 7 :(得分:0)

ä¸ï¼Œä½ ä¸å¿…删除[]指针2,因为你没有为它分é…内存ï¼

语å¥pointer2 = pointer1使pointer2指å‘与pointer1相åŒçš„内存地å€ï¼Œä¸ä¸ºå…¶åˆ†é…任何é¢å¤–的内存。

答案 8 :(得分:0)

æ¯ä¸ªnew应该åªæœ‰ä¸€ä¸ªdelete匹é…{{1}}。如果删除了å¦ä¸€ä¸ªæŒ‡é’ˆï¼Œåˆ™ä¼šç ´å该规则。

答案 9 :(得分:0)

你在这里åšçš„åªæ˜¯è¯´æ˜Žnew char[256]分é…的内存å—将在åŒä¸€æ—¶åˆ»è¢«pointer1å’Œpointer2指å‘。

如果你之åŽå†™äº†delete[] pointer2;语å¥ï¼Œé‚£å°†æ˜¯ä¸€ä¸ªå†…存泄æ¼ã€‚

答案 10 :(得分:0)

这是您æ€è·¯ä¸Šçš„å·®è·ï¼šæ‚¨ä¸åˆ é™¤æŒ‡é’ˆ - 删除内存。您åªéœ€ä½¿ç”¨æŒ‡é’ˆæ¥æ ‡è¯†è¦é‡Šæ”¾çš„内存å—。由于这两个å˜é‡æŒ‡å‘åŒä¸€ä¸ªå†…存,因此删除一个就完全等åŒäºŽåˆ é™¤å¦ä¸€ä¸ªã€‚æ¢å¥è¯è¯´ï¼Œåˆ é™¤ä¸¤è€…ä¸Žåˆ é™¤å…¶ä¸­ä¸€ä¸ªç›¸åŒ - 这显然是错误的。