内联函数的内存泄漏

时间:2011-11-10 12:02:37

标签: c++ memory-leaks

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

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行(上面标记)是内存泄漏。 上面的代码有什么问题?

6 个答案:

答案 0 :(得分:2)

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

#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)

答案 1 :(得分:2)

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

答案 2 :(得分:2)

  

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

感谢。它帮助了我。

答案 3 :(得分:1)

上面的代码是无泄漏的。该工具可能表明两种情况都有泄漏:

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

答案 4 :(得分:0)

只有在使用newnew []获取免费商店内存并且不分别通过调用deletedelete[]将其释放时,才会发生内存泄漏。

std::string在freestore上进行内部分配,但是你将它作为返回类型返回,而不是泄漏内存。

您展示的代码不使用newnew [],因此您显示的代码中没有内存泄漏。
您使用的工具似乎具有误导性。或者您需要向我们展示您的真实代码以获得更好的答案。

答案 5 :(得分:0)

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