【问题标题】:Does below code have potential memory leak?下面的代码是否有潜在的内存泄漏?
【发布时间】:2021-03-17 02:49:40
【问题描述】:

Sonarqube 报告以下代码的内存泄漏。如果我们将strdup() 的输出分配给char * temp 变量并稍后释放temp 变量,则SQ 不会报告任何潜在的内存泄漏。

class A 
{ 
  public: 
  string name;
}; 
  
int main() 
{ 
    
  A a;
  char * str = "abcdef";
  a.name = strdup(str);
  return 0;
} 

【问题讨论】:

  • 不,它没有潜在的内存泄漏,它有实际的内存泄漏。
  • 令人惊讶的是如何将匹配无关的代码添加到这个问题中。为什么会有A的类?为什么将字符串文字分配给char *(不应编译)。都可以换成main() { strdup("abcdef"); }

标签: c++


【解决方案1】:

是的,这段代码有内存泄漏。 strdup() 分配的动态内存必须是free()'d,例如:

int main() 
{ 
  A a;
  char *str = strdup("abcdef");
  a.name = str;
  free(str);
  return 0;
} 

但是,在这种情况下没有理由使用strdup(),因为字符串文字可以直接分配给std::string

int main() 
{ 
  A a;
  a.name = "abcdef";
  return 0;
} 

【讨论】:

    【解决方案2】:

    strdup at cppreference:

    char * strdup( const char *str1 ); 返回一个指向以 null 结尾的字节字符串的指针,它是 str1 指向的字符串的副本。 必须将返回的指针传递给 free 以避免内存泄漏。

    所以 - 是的,你有内存泄漏。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多