C++ valgrind 可能在 STL 字符串上泄漏

标签 c++ string stl valgrind

我没有看到下面泄漏的原因。

#include <iostream>
#include <cstdlib>

int fail(const std::string str)
{
    std::cerr<< str << std::endl;
    exit(1);
}

const std::string usage()
{
    std::string a = "a";
    return a;
}   

int main()
{
    fail(usage());
    return 0;
}

Valgrind 说:

==7238== 14 bytes in 1 blocks are possibly lost in loss record 1 of 1
==7238==    at 0x402377E: operator new(unsigned) (vg_replace_malloc.c:224)
==7238==    by 0x40E7C03: std::string::_Rep::_S_create(unsigned, unsigned, 
std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.10)
==7238==    by 0x40E8864: (within /usr/lib/libstdc++.so.6.0.10)
==7238==    by 0x40E89D5: std::string::string(char const*, std::allocator<char> const&) 
(in /usr/lib/libstdc++.so.6.0.10)
==7238==    by 0x80488EC: usage() (main.cpp:12)
==7238==    by 0x804897C: main (main.cpp:18)
==7238== LEAK SUMMARY:
==7238==    definitely lost: 0 bytes in 0 blocks.
==7238==      possibly lost: 14 bytes in 1 blocks.
==7238==    still reachable: 0 bytes in 0 blocks.
==7238==         suppressed: 0 bytes in 0 blocks.

问题出在 fail() 函数中。当它退出()时,内存泄漏。

如果我注释掉 exit(1);那么就没有可能的泄漏。

此外,如果我将签名从 int 失败(const std::string str) 到 int 失败(const char* str)

那么也没有可能的泄漏。我不喜欢这个解决方案,因为我使用的是 fail(string + (LINE)) 类型的东西,但无论如何,这里发生了什么?

如果有人能解释我会很高兴。

谢谢!

(upps。我猜之前问过同样的问题,抱歉!Valgrind reports memory leak when assigning a value to a string)

最佳答案

当您调用 exit() 时,不会调用自动对象(局部变量)的析构函数。

在您的特定示例中,未调用 std::string 析构函数,因此永远不会释放 std::string 拥有的内存。

如果你让 fail() 接受一个 const char* 就没有泄漏的原因是 const char* 没有析构函数>;销毁指针时不会释放任何内容。如果指针指向动态分配的内存,那么在程序退出之前必须(由您)释放该内存,否则就会发生内存泄漏。如果它指向字符串文字,则不会发生内存泄漏,因为字符串文字具有静态存储持续时间(也就是说,它们在程序的整个生命周期内都存在)。

关于C++ valgrind 可能在 STL 字符串上泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687539/

相关文章:

c++ - 如何通过键和值比较两个映射并将差异映射存储在 C++ 的结果映射中?我们有它的任何 STL api 吗?

c++ - 用 2x1 榻榻米垫填充 HxW 房间有多少种方法?

c++ - 模板类,函数特化

linux - 接受任何参数的 Shell 脚本

c++ - 字符串匹配算法

c++ - C++: vector 分配器行为,内存分配和智能指针

c++ - 如何使用 boost.log 写入文件?

c++ - 从命令行运行到 "Run without Debugging"的不同行为

使用 fgets 和 strstr 在 C 中计算字符串

C++ Vigenere密码