c++ - 无法找到 Valgrind 检测到的内存泄漏

标签 c++ memory-leaks valgrind

我正在编写一个程序,但我有一个内存泄漏问题,我无法确定。我对 C/C++ 也不是很有经验。我将发布一个 valgrind 错误以及相关的类定义和函数......如果我忘记了什么,请问我会更新 :) 我没有发布所有 valgrind 报告的原因是有很多它们,但它们很相似……唯一的区别是它具有的堆栈跟踪。

一开始我的设计很糟糕,所以为了修复内存泄漏,我的想法是创建一个全局工厂来添加我的对象,以便稍后删除它们。我用工厂方法替换了每次出现的“new”以创建它。在这种情况下,它是类 Column。我确信 makeColumn 创建的每个对象都被删除了,因为我使用 vector 来存储指针。在程序结束前调用迭代 vector 并删除其中每个项目的函数。

这个 valgrind 报告让我觉得,不知何故,一个字符串并没有被取消分配。我设置了 GLIBCXX_FORCE_NEW 变量,它对检测到的泄漏没有影响。我正在使用 gcc 4.7.2。

此外,是的,我正在从 ANTLR 生成的解析器接收信息...这可能无关紧要,因为 ANTLR 处理它自己的内存。字符指针是来自 ANTLR 的唯一数据。

==23168== 15 bytes in 1 blocks are definitely lost in loss record 10 of 30
==23168==    at 0x4ACE73C: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==23168==    by 0x4BA62A3: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib32/libstdc++.so.6.0.17)
==23168==    by 0x4BA75EE: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib32/libstdc++.so.6.0.17)
==23168==    by 0x4BA7F3F: std::string::assign(std::string const&) (in /usr/lib32/libstdc++.so.6.0.17)
==23168==    by 0x4BA7F92: std::string::operator=(std::string const&) (in /usr/lib32/libstdc++.so.6.0.17)
==23168==    by 0x82E0B57: GenericFactory::makeColumn(char const*, char const*, char const*) (global.cpp:246)
==23168==    by 0x82DEA23: addTable (helper.cpp:93)
==23168==    by 0x810DE1F: query_table_expression (OracleSQLParser.c:165181)
==23168==    by 0x8108F66: table_reference (OracleSQLParser.c:162767)
==23168==    by 0x81154B1: join_clause (OracleSQLParser.c:168172)
==23168==    by 0x82A0845: synpred349_OracleSQL_fragment (OracleSQLParser.c:460632)
==23168==    by 0x82AFA48: synpred349_OracleSQL (OracleSQLParser.c:469414)

helper.cpp:addTable - putValue 只是将指针添加到 map 。

void addTable(char* schema, char* table) {
    ::gbl_info->tables->putValue(::gbl_info->factory.makeColumn(schema,table,""),NULL);
}

GenericFactory::makeColumn

Column* GenericFactory::makeColumn(const char* schema,const char* table, const char* column) {
    this->count++;
    Column* col = new Column(schema,table,column);
    this->allocated_objects.push_back(col);
    return col;
}

列::列

Column::Column(const char* schema, const char* table, const char* column) {
    string temp = schema;
    this->schema = normalize(temp);
    temp = table;
    this->table = normalize(temp);
    temp = column;
    this->column = normalize(temp);
    temp = schema;
    temp = temp + "." + table + "." + column;
    this->text = normalize(temp);
}

归一化

string& normalize(string& str) {
    for (string::iterator p=str.begin(); p != str.end(); p++)
        *p = toupper(*p);
    str.erase(remove(str.begin(),str.end(),'"'),str.end()); // erase double quotes
    return str;
}

列定义:SQLData 没有成员或构造函数

class Column : public SQLData {
    std::string text;
    std::string schema;
    std::string table;
    std::string column;
public:
    std::string alias; // TABLE alias
    Column(const char*,const char*,const char*);
    Column(const std::string qn);
    //Has functions too, but probably irrelevant
}

我花了几个小时试图解决这个问题,但我只是不确定我在哪里失去了内存……程序在处理数据时可以运行几分钟甚至几个小时,所以它真的会累积起来。

最佳答案

解决此类问题(未知来源错误)的好方法是,尝试下载 GCC 并针对“the Wall”提交代码'.

关于c++ - 无法找到 Valgrind 检测到的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17865498/

相关文章:

c++ - 不规则形状的区域

.net - 导致 “Arithmetic operation resulted in overflow”错误的System.DirectoryServices.DirectorySearcher

c - 将 Vala 与 C 结合使用时出现内存泄漏

linux - 如何从分析器中获取每个样本的完整堆栈转储以用于火焰图?

gdb - 测量堆栈指针峰值及其 PC 位置

c++ - 使用 std::multimap,是否保证 begin() 方法返回最新元素?

java - 更改android中特定页面的方向

c++ - 我可以保证nullptr的地址始终为0吗?

javascript - 可以改进此代码以避免内存泄漏或更稳定吗?

c - 使用 C 字符串的内存泄漏