std::string 内存泄漏

Posted

技术标签:

【中文标题】std::string 内存泄漏【英文标题】:std::string memory leak 【发布时间】:2012-10-21 20:18:08 【问题描述】:

我有这个类AppController和函数connectPlayer

/* AppController.h */
    class AppController
    
          // Some other declarations ...
      private:
            static const string TAG;
    ;

/* AppController.cpp */

#include "AppController.h"
const string AppController::TAG = "AppController";

AppController::AppController() 
    /* some code here...*/


void AppController::connectPlayer() 
    std::string port;
    std::string host;
    port = CM->getMenu()->getData("PORT");
    host = CM->getMenu()->getData("HOST");
    this->setState("Connecting...");
    Logger::info(TAG, "Port: " + port);
    Logger::info(TAG, "Host: " + host);

当我执行程序时,我从 valgrind 得到这个:

==7848== 25 bytes in 1 blocks are definitely lost in loss record 160 of 671
==7848==    at 0x402842F: operator new(unsigned int) (vg_replace_malloc.c:255)
==7848==    by 0x4210A83: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==7848==    by 0x4212CF7: char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==7848==    by 0x4212E65: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.16)
==7848==    by 0x8080501: AppController::connectPlayer() (in /home/maine/Escritorio/taller7542/UltimaVersion/src/main)

有什么想法吗?提前谢谢!

【问题讨论】:

AppController::TAG 是什么? @PiotrNycz,这只是类的名称。我用它在 Logger 中写入程序执行期间发生的重要事件。 拥有 non-POD 静态持续时间的对象(例如您的 AppController::TAGstd::string)可能不是一件好事。您可能想尝试使用像简单的 const char [] 这样的 POD。另请参阅this section from Google's C++ style guide。 【参考方案1】:

您在全局范围内有 std::string 对象:AppController::TAG

当应用程序以不正常的方式完成时,您会遇到这些全局对象的 valgrind 错误。大概没什么好担心的。

如果您(不能/不想)更改程序 - 请阅读此文档:http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress 以摆脱这个错误。

【讨论】:

【参考方案2】:

有时,valgrind 会给出误报。这意味着即使 valgrind 说你失去了记忆,实际上你没有。

唯一需要担心的是调用exit() 函数时,如this 问题中所述。

如果您不想再看到这些警告,您可以创建一个抑制文件,为 valgrind 提供一些关于哪些错误可以忽略的信息。

【讨论】:

【参考方案3】:

当我在全局范围内的类中有一个字符串时,我曾经见过这个问题。 Valgrind 一直抱怨我在泄漏内存。我只是在退出时“删除”了对象,错误就消失了。

【讨论】:

以上是关于std::string 内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

STL 容器和内存泄漏

字符串内存分配中可能存在内存泄漏

使用 Char* 查找内存泄漏的原因

visual c++ 2013 内存泄漏 wostringstream、imbue 和语言环境方面

c++ 内存泄漏问题

MFC内存泄漏调试