• 6496阅读
  • 7回复

关于循环中的内存释放求助 [复制链接]

上一主题 下一主题
离线ldqiang
 
只看楼主 正序阅读 楼主  发表于: 2008-04-22
— 本帖被 XChinux 执行加亮操作(2008-04-22) —
请看下面代码:
char*    buffer = NULL;
  for(条件)//
    {
          int count = 通过外部数据计算出来;    //每次循环分配的内存大小不一样
          buffer = new  char[ count];
        if(条件)
            {
              操作buffer
              delete []buffer;
              buffer = NULL;
            }
      }
      if( buffer != NULL)//防止产生内存泄漏
          {
                delete []buffer;
              buffer = NULL;
          }
这是在循环中释放了内存,外部做了一次检查

还有就是第二种:
char*    buffer = NULL;
  for(条件)//
    {
          int count = 通过外部数据计算出来;    //每次循环分配的内存大小不一样
          buffer = new  char[ count];
        if(条件)
            {
              操作buffer
            }
      }
      if( buffer != NULL)//释放内存          {
                delete []buffer;
              buffer = NULL;
          }
大家给点意见,哪种好一样,为什么?谢谢!
离线tkfly0324
只看该作者 7楼 发表于: 2008-04-25
同意
离线xjcook

只看该作者 6楼 发表于: 2008-04-25
第一种本来是有泄露的,改成foxyz所说那样,应该没有了。
第二种本来的没有泄露。

我认为第二种好,因为只new一次,delete一次,效率要高些,
new次数非常频繁而且很多的话,是很浪费效率的。
如果个数不多,用的次数也不多的话,无所谓。

第一种有一个第二种没有的优势,就是可以根据不同情况new不同的东西,
如果new的东西不一样的时候只能用第一种。
离线ldqiang
只看该作者 5楼 发表于: 2008-04-25
感谢
离线foxyz

只看该作者 4楼 发表于: 2008-04-24
char*    buffer = NULL;
  for(条件)//
    {
          int count = 通过外部数据计算出来;    //每次循环分配的内存大小不一样
          buffer = new  char[ count];
        if(条件)
            {
              操作buffer
              delete []buffer;
              buffer = NULL;
            }
      }
      if( buffer != NULL)//防止产生内存泄漏
          {
                delete []buffer;
              buffer = NULL;
          }
这是在循环中释放了内存,外部做了一次检查

%%这个肯定有泄漏!你分配的时候是在条件外边,delete的时候是在条件里边,虽然你在循环外增加了一次释放,但是你在循环粒很可能分配了多次!
改成:
char*    buffer = NULL;
  for(条件)//
    {
          int count = 通过外部数据计算出来;    //每次循环分配的内存大小不一样
        if(条件)
            {
                buffer = new  char[ count];
              操作buffer
              delete []buffer;
              buffer = NULL;
            }
      }


还有就是第二种:
char*    buffer = NULL;
  for(条件)//
    {
          int count = 通过外部数据计算出来;    //每次循环分配的内存大小不一样
          buffer = new  char[ count];
        if(条件)
            {
              操作buffer
            }
      }
      if( buffer != NULL)//释放内存          {
                delete []buffer;
              buffer = NULL;
          }
大家给点意见,哪种好一样,为什么?谢谢!
%%这个就更加要泄漏了,在循环里分配多次,只在循环外释放一次
改成:
char*    buffer = NULL;
  for(条件)//
    {
          int count = 通过外部数据计算出来;    //每次循环分配的内存大小不一样
        if(条件)
            {
                buffer = new  char[ count];
              操作buffer
              delete []buffer;
                buffer = NULL;
            }
      }
离线gery_sunjian
只看该作者 3楼 发表于: 2008-04-23
内存泄漏

第一个 中 的 后面那个释放
if( buffer != NULL)//防止产生内存泄漏
{
              delete []buffer;
              buffer = NULL;
  }

只 释放了 最后 for 循环 分配的

我的见解/
离线ldqiang
只看该作者 2楼 发表于: 2008-04-22
感谢楼上的见解,但是第一个当失败后,后面做了内存检查,如果不为0就清除内存,然后给上0值。
离线yuan5lai9
只看该作者 1楼 发表于: 2008-04-22
我感觉都有内存泄露啊..
第一个,for循环 每次都有新分配内存空间啊,只有在if(条件)成立的时候才delete了,不成立的时候就丢掉了内存.
第二个MS泄露的更厉害吧,只delete掉了最后一个.

不知道是不是 这样的,高手来看看吧
快速回复
限100 字节
 
上一个 下一个