找不到瓦尔格林德检测到的内存泄漏
Can't find memory leak detected by Valgrind
我正在编写一个程序,但我无法确定内存泄漏。我对C/C++也不是很有经验。我将发布一个valgrind错误以及相关的类定义和函数。。。如果我忘记了什么,只要问一下,我就会更新:)我没有发布所有valgrind报告的原因是有很多,但它们很相似。。。唯一的区别是它的堆栈跟踪。
我一开始设计得很糟糕,所以为了修复内存泄漏,我的想法是创建一个全局工厂来添加我的对象,以便以后删除它们。我用工厂方法替换了每次出现的"new"来创建它。在这种情况下,它是Column类。我确信makeColumn创建的每个对象都会被删除,因为我使用向量来存储指针。在程序结束前,将调用遍历向量并删除其中每个项的函数。
这份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只是添加指向映射的指针。
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并将代码扔到"墙上"。
好吧,我想好了。当我用-Wall运行它时,这个问题就出现了,所以我会接受这个答案:)以下是问题所在。
虚拟析构主义者。由于不熟悉C++,我昨天才听说它们。。。我不认为我需要使用一个,因为我的派生类中实际上没有任何清理代码。错误的为了在派生类上调用默认的析构函数,必须将超类(在本例中为SQLData)的析构因子声明为虚拟的。因此,在我的派生类中没有清理字符串成员,即使它们不是指针。
有趣的是,我不建议Cygwin进行调试。在安装的gcc-Cygwin上,-Wall选项并没有警告我这一点,但当我在Ubuntu机器上编译时,它会告诉我每个类的情况。
因此,我所做的一切来修复这个巨大的内存泄漏就是在我的SQLData类定义中添加以下内容:
virtual ~SQLData() { }
砰,修好了。我不需要为我的任何派生类声明声明析构函数。
谢谢你的帮助!
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏