内联函数的内存泄漏

memory leak of inline function

本文关键字:内存 泄漏 函数      更新时间:2023-10-16

我有一个内联函数定义如下:

inline string Change(char *pointer) {
    string str;
    char temp[32] = "";
    sprintf(temp,"%c:%c:%c:%c:%c:%c", //line 1
        temp[0],temp[1],temp[2],
        temp[3],temp[4],temp[5],
    );
    str = temp;
    return str;
}

当我使用内存泄漏工具检查它时,它指示第1行(标记在上面)是内存泄漏。以上代码的问题是什么?

我创建了完全可编译的示例:

#include <string>
#include <iostream>
#include <cstdio>
std::string Change( char * ) {
    std::string str;
    char temp[32] = "";
    sprintf(temp,"%c:%c:%c:%c:%c:%c", //line 1
        temp[0],temp[1],temp[2],
        temp[3],temp[4],temp[5]
    );
    str = temp;
    return str;
}
int main()
{
    char a[]={"abaaaaa2"};
    std::cout<<Change(a)<<std::endl;
}

在valgrind下运行时,我没有检测到泄漏:

==16829== 
==16829== HEAP SUMMARY:
==16829==     in use at exit: 0 bytes in 0 blocks
==16829==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==16829== 
==16829== All heap blocks were freed -- no leaks are possible
==16829== 
==16829== For counts of detected and suppressed errors, rerun with: -v
==16829== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 8)

如果你想知道泄漏的确切位置,你可以使用插件。你可以选择一个对你方便的插件。对我来说,它是deleaker。这个领域有很多发展!!

如果你想知道泄漏的确切位置,你可以使用插件。你可以选择一个对你来说方便的插件。对我来说,它是deleaker。这个领域有很多发展!!

谢谢。

上面的代码是没有泄漏的。该工具可能在以下两种情况下指示泄漏:

  1. 从函数返回的字符串被分配给另一个字符串变量,并且在工具运行之前该变量没有被销毁-然后从技术上讲,字符串主体仍然在此时被分配并且工具报告它
  2. 字符串主体分配器缓存字符串主体块以供将来重用,并且在分配器释放所有缓存块之前运行该工具-然后从技术上讲,字符串主体被分配并工具报告它。

工具出现故障;这里没有内存泄漏

内存泄漏仅发生在使用newnew []获取空闲存储内存并且不通过分别调用deletedelete[]来释放它时。

std::string在内部分配自由,但你返回它作为返回类型,这是不泄漏内存。

你所展示的代码没有使用newnew [],所以在你所展示的代码中没有内存泄漏。你使用的工具似乎有误导作用。或者你需要向我们展示你的真实的代码来得到一个更好的答案。