C++中的std::string内存泄漏问题

5

我有一个名为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)

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

2
AppController::TAG 是什么? - PiotrNycz
@PiotrNycz,这只是类的名称。我使用它在记录器中编写程序执行期间发生的重要事件。 - Maria Ines Parnisari
拥有静态持续时间的非 POD 对象(例如您的 AppController::TAG,它是一个 std::string)可能不是好事。您可以尝试使用像简单的 const char [] 这样的 POD。请参见 Google 的 C++ 风格指南中的此部分 - Mr.C64
3个回答

7
您在全局范围内有一些std::string对象:AppController::TAG
当应用程序以不太正常的方式结束时,您可能会收到这些全局对象的valgrind错误。也许没什么好担心的。
如果您(不能/不想)更改程序-请阅读此文档:http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress 来消除此错误。

1

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


1
有时候,valgrind 会给出错误的警告。这意味着即使 valgrind 告诉你丢失了内存,实际上并没有丢失。
唯一需要担心的是当你调用 exit() 函数时,就像 this 中所解释的那样。
如果你不想再看到这些警告,可以创建一个抑制文件,向 valgrind 提供一些信息以忽略哪些错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接