Valgrind 内存泄漏与 std::map 中的 std::string [英] Valgrind memory leak with std::string in std::map

查看:51
本文介绍了Valgrind 内存泄漏与 std::map 中的 std::string的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是 Valgrind 的输出:

Here is the output from Valgrind:

==6519==    at 0x4C25885: operator new(unsigned long) (vg_replace_malloc.c:319)
==6519==    by 0x4EE65D8: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:104)
==6519==    by 0x4EE7CE0: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (basic_string.tcc:138)
==6519==    by 0x4EE80F7: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (basic_string.h:1725)
==6519==    by 0x41C399: pilInpOpts::pilInpOpts() (pilInpOpts.cpp:12)
==6519==    by 0x403A55: main (main.cpp:32)

对于地图中的每个条目都会重复相同的错误.

This same error is repeated for every entry in the map.

main.cpp 第 32 行是:

main.cpp line 32 is:

    pilInpOpts input;

pilInpOpts 的第 12 行是构造函数的一部分:

Line 12 of the pilInpOpts is part of the constructor:

#include "pilInpOpts.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>


pilInpOpts::pilInpOpts() 
{
// create the map of options, put in alphabetical order to ease sorting
piloptmap.insert(std::pair<std::string, bool>("bforce",false));
piloptmap.insert(std::pair<std::string, bool>("coef",false));
piloptmap.insert(std::pair<std::string, bool>("dualjet",false));
piloptmap.insert(std::pair<std::string, bool>("flow",false));
piloptmap.insert(std::pair<std::string, bool>("gforce",false));
piloptmap.insert(std::pair<std::string, bool>("gpress",false));
piloptmap.insert(std::pair<std::string, bool>("matlab",false));
piloptmap.insert(std::pair<std::string, bool>("model",false));
piloptmap.insert(std::pair<std::string, bool>("out_shade",false));
piloptmap.insert(std::pair<std::string, bool>("out_shade_file",false));
piloptmap.insert(std::pair<std::string, bool>("press",false));
piloptmap.insert(std::pair<std::string, bool>("proc",false));
piloptmap.insert(std::pair<std::string, bool>("shade",false));
piloptmap.insert(std::pair<std::string, bool>("summary",false));
piloptmap.insert(std::pair<std::string, bool>("trans",false));
// need to define the default filepaths, this is needed because they are optional
platpath = "";
vehpath = "";
apppath = "";
dockpath = "";
};

我在 SO 中发现了一些帖子,其中说 Valgrind 可能会产生误报.例如:std::string 内存泄漏

I found some posts in SO which said Valgrind may produce false positives. For example: std::string memory leak

这是一个误报,因为 std::string 有它需要的所有构造函数等吗?或者我应该更改为在地图中使用 C 字符数组?

Is this a false positive since std::string has all the constructors etc it needs to do this? Or should I change to use C character arrays in the map?

推荐答案

这种行为的一个可能原因可能是 C++ 标准库实现中的内存池.

One of the probable reasons of this behavior may be memory pooling in C++ standard library implementation.

来自 Valgrind 常见问题:

很多被破坏的对象的内存不是立即的释放并返回给操作系统,但保留在池中以备后用重复使用.池在出口处未释放的事实程序导致 Valgrind 报告此内存仍可访问.这在出口处不释放池的行为可以称为图书馆.

Memory for quite a number of destructed objects is not immediately freed and given back to the OS, but kept in the pool(s) for later re-use. The fact that the pools are not freed at the exit of the program cause Valgrind to report this memory as still reachable. The behaviour not to free pools at the exit could be called a bug of the library though.

您可以在运行您的应用之前设置 GLIBCXX_FORCE_NEW 环境变量以强制 STL 尽快释放内存.

You can set GLIBCXX_FORCE_NEW environment variable before running your app to force STL to free memory as soon as possible.

另见有关 libstdc++ 内存分配器实现细节的这些链接:

See also these links on details of libstdc++ memory allocator implementation:

这篇关于Valgrind 内存泄漏与 std::map 中的 std::string的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆